[Java基础] stream流中Collectors.toMap报空指针异常情况
代码示例:
List<BookEntity> bookEntityList = new ArrayList<>();BookEntity bookEntity = BookEntity.builder().bookName("钢铁是怎样炼成的").bookOwner("xinliushijian").build();BookEntity bookEntity1 = BookEntity.builder().bookName("悲惨世界").bookOwner("xinliu").build();bookEntityList.add(bookEntity);bookEntityList.add(bookEntity1);BookEntity bookEntity2 = BookEntity.builder().bookName(null).bookOwner("shijian1").build();BookEntity bookEntity3 = BookEntity.builder().bookName(null).bookOwner("shijian2").build();bookEntityList.add(bookEntity2);bookEntityList.add(bookEntity3);// key中有null,不报错Map<String, String> map = bookEntityList.stream().collect(Collectors.toMap(BookEntity::getBookName, BookEntity::getBookOwner, (v1, v2) -> v2));System.out.println(map); // 打印1BookEntity bookEntity4 = BookEntity.builder().bookName("笑面人").bookOwner(null).build();bookEntityList.add(bookEntity4);// value中有null,报空指针异常Map<String, String> map1 = bookEntityList.stream().collect(Collectors.toMap(BookEntity::getBookName, BookEntity::getBookOwner, (v1, v2) -> v2));System.out.println(map1); // 打印2
打印1:
{null=shijian2, 悲惨世界=xinliu, 钢铁是怎样炼成的=xinliushijian}
打印2:
Exception in thread “main” java.lang.NullPointerException
at java.util.HashMap.merge(HashMap.java:1225)
at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
at java.util.stream.ReduceOps 3 R e d u c i n g S i n k . a c c e p t ( R e d u c e O p s . j a v a : 169 ) a t j a v a . u t i l . A r r a y L i s t 3ReducingSink.accept(ReduceOps.java:169) at java.util.ArrayList 3ReducingSink.accept(ReduceOps.java:169)atjava.util.ArrayListArrayListSpliterator.forEachRemaining(ArrayList.java:1384)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
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)
报错原因:
并不是因为map不允许value值为null,我们都知道map中key和value都可以为null,而是merge方法中value不允许为null
解决办法:
所以在进行map转换之前,若无法保证数据非空,还是需要过滤下数据,只保留非空的部分数据(key为null一般无意义,也不要了)
// 正确写法Map<String, String> map2 = bookEntityList.stream().filter(v -> !StringUtils.isAnyBlank(v.getBookName(), v.getBookOwner())).collect(Collectors.toMap(BookEntity::getBookName, BookEntity::getBookOwner, (v1, v2) -> v2));System.out.println(map2); // 打印3
打印3:
{悲惨世界=xinliu, 钢铁是怎样炼成的=xinliushijian}