问题描述
在日常开发中总会有这样的代码,将一个List转为Map集合,使用其中的某个属性为key,某个属性为value。
常规实现
public class CollectorsToMapDemo {@Data@NoArgsConstructor@AllArgsConstructorpublic static class Student {private String name;private Integer age;}public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student("张三", 18));list.add(new Student("李四", 19));list.add(new Student("王五", 20));// 将这个list转为map集合,key=age,value=studentMap<Integer, Student> map = new HashMap<>();for (Student student : list) {if (map.containsKey(student.getAge())) {// 如果key已经存在的解决逻辑map.put(student.getAge(), student);} else {map.put(student.getAge(), student);}}}
}
Java8实现
public class CollectorsToMapDemo {@Data@NoArgsConstructor@AllArgsConstructorpublic static class Student {private String name;private Integer age;}public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student("张三", 18));list.add(new Student("李四", 19));list.add(new Student("王五", 20));// 将这个list转为map集合,key=age,value=studentMap<Integer, Student> map = list.stream().collect(Collectors.toMap(Student::getAge, Function.identity()));System.out.println(map);}
}
输出结果:
解释一下参数:
第一个参数:Student::getAge表示选择Student的getAge作为map的key值;
第二个参数:Function.identity()表示选择将原来的对象作为Map的value值;(也可以使用s -> s来表示选对象)
key值重复,就会报错。
public class CollectorsToMapDemo {@Data@NoArgsConstructor@AllArgsConstructorpublic static class Student {private String name;private Integer age;}public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student("张三", 18));list.add(new Student("李四", 19));list.add(new Student("王五", 20));list.add(new Student("赵六", 18));// 将这个list转为map集合,key=age,value=studentMap<Integer, Student> map = list.stream().collect(Collectors.toMap(Student::getAge, Function.identity()));System.out.println(map);}
}
输出结果:
如何解决:
要传第三个参数,就是key值重复的处理逻辑。
例如传(a, b) -> b
就表示a和b重复选后输入的b元素。
Map<Integer, Student> map = list.stream().collect(Collectors.toMap(Student::getAge, Function.identity(), (a,b)->b));