问题描述
在日常开发中总会有这样的代码,将一个List转为Map集合,使用其中的某个属性为key,某个属性为value。
常规实现
public class CollectorsToMapDemo {
@Data
@NoArgsConstructor
@AllArgsConstructor
public 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=student
Map<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
@AllArgsConstructor
public 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=student
Map<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
@AllArgsConstructor
public 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=student
Map<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));