【JDK8遇到的坑】 Collectors.toMapkey可以为nullvalue不能为null 否则抛空指针异常NullPointerException

it2024-01-11  58

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; } }

 

最新回复(0)