【有书共读】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引用之间的链接
凡岛公司福利 831人发布