【有书共读】Java攻略 读书笔记03

构造函数引用

  • 前面我们知道了怎么将lambda表达式应用在方法引用上,下面我们来学习怎么把lambda表达式引用在构造函数的引用上

  • 首先我们创建一个Person类。Person类的唯一作用是包装一个名为name的简单字符串特征,如下例子所示
  • public class Person {  private String name;  public Person(){}  public Person(String name){  this.name = name;
        }  public String getName() {  return name;
        }  public void setName(String name) { this.name = name;
        }
    } 

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; /** 给定一个字符串集合,通过lambda表达式或构造函数引用,将其中的每个字符串映射到Person.  */ public class Test02 {  public static void main(String [] args){
            List<String> names = Arrays.asList("Grace Hopper","Ada LoveLace","Karen Sparck Jones"); //使用lambda表达式来调用构造函数    List<Person> people = names.stream()
                    .map(name -> new Person(name))
                    .collect(Collectors.toList());
            System.out.println(people);  //使用构造函数来实例化Person    List<Person> people1 = names.stream()
                    .map(Person::new)//引用Person类中的构造函数    .collect(Collectors.toList());
            System.out.println(people1);
        }
    }

复制构造函数

  • 复制构造函数传入一个Person参数,并返回一个具有相同特性的新Person
  • public Person(Person p){
        this.name = p.name;
    }
    
  • 如果需要将流代码从原始实例中分离出来,复制构造函数将很有用。假设我们一个人员列表,先将其转换成流,再转换回列表,那么引用不会发生变化。

  • 如下例子,将列表装换成流,再转换回列表
  • import static org.testng.Assert.assertEquals;
    import static org.testng.Assert.assertTrue;
    
    import java.util.List;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    public class Test02 {
        public static void main(String [] args){  Person before = new Person("Grace Hopper");
    
            List<Person> people = Stream.of(before)
                    .collect(Collectors.toList());
            Person after = people.get(0);
            assertTrue(before == after);//对象相同
            //使用before引用修改人名
            before.setName("Grace Murray Hopper");
            //after引用中的人名已被修改
            assertEquals("Grace Murray Hopper",after.getName());
        }
    }
    

  • 通过复制构造函数来切断连接
  • public class Test04 {
        public static void main(String [] args){
            Person before = new Person("Grace Hopper");
    
            people = Stream.of(before)
                    .map(Person::new)//使用复制构造函数
                    .collect(Collectors.toList());
            
            after = people.get(0);
            assertFalse(before == after);//对象不同
            assertEquals(before,after);//二者是等效
            
            before.setName("Rear Admiral Dr. Grace Murray Hopper");
            assertFalse(before.equals(after));
        }
    }
    
  • 由上例子,可见,当调用map方法是,上下文是Person实例的流,因此,person::new调用构造函数,它传入一个Person实例并返回一个等效的新实例,同时切断了before和after引用之间的链接

#Java##读书笔记##笔记#
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务