欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > [Java基础] stream流中Collectors.toMap报空指针异常情况

[Java基础] stream流中Collectors.toMap报空指针异常情况

2025/6/16 7:00:58 来源:https://blog.csdn.net/weixin_43024834/article/details/148569632  浏览:    关键词:[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}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词