1jdk8 Collectors.toMap key可以为null value不能为null 否则抛空指针异常
Exception in thread "main" java.lang.NullPointerException
at java.util.HashMap.merge(HashMap.java:1224)
at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at com.Demo.main(Demo.java:35)
由HashMap源码分析可知 1223行导致
2示例异常代码
public class Demo {
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
Student stu1 = new Student();
stu1.setId("1");
stu1.setName("张三1");
stu1.setClassId("1");
list.add(stu1);
Student stu2 = new Student();
stu2.setId("2");
stu2.setName("张三2");
stu2.setClassId("2");
list.add(stu2);
Student stu3 = new Student();
stu3.setId(null);//value为空
stu3.setName("张三3");
stu3.setClassId("3");
list.add(stu3);
//<classId,id> classId重复 value取第一个
Map<String, String> result = list.stream().collect(
Collectors.toMap(key -> key.getClassId(), value -> value.getId(),(v1, v2) -> v1));
System.out.println(result);
}
}
class Student {
//ID
private String id;
//姓名
private String name;
//班级ID
private String classId;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClassId() {
return classId;
}
public void setClassId(String classId) {
this.classId = classId;
}
}