当前位置:首页 > 服务端 > 使用Collectors.toMap遇到NullPointerException

使用Collectors.toMap遇到NullPointerException

这个坑也是踩过好几次了,记录一笔。

 

当试图使用Collectors.toMap将一个stream收集为Map的时候,若构造map的valueMapper返回null时,则会报NullPointerException。举个栗子:

  @Test
  public void testToMap() {
    final Map<Integer, Integer> collect = Stream.of(null, 0, 1, 2, 3).collect(
        Collectors.toMap(x -> random.nextInt(), Function.identity(), (x1, x2) -> x1));
    log.info(String.valueOf(collect));
  }

 

理由么,因为在Collectors.toMap中调用了map::merge方法,而map::merge对value做了空校验Objects::requireNonNull

 

这个merge的实现感觉有点反直觉, map.put(null, null) 没问题,怎么 map.merge(-1, null, (x, y) -> x) 就有问题了么…

稍微了解了一下,这居然是java的feature,所以没毛病…

 

解决方式就是自己去实现一个map的Collector收集器

  @Test
  public void testToCollect() {
    final Map<Integer, Integer> collect = Stream.of(null, 0, 1, 2, 3).collect(
        HashMap::new, (map, param) -> map.put(param, random.nextInt()), HashMap::putAll);
    log.info(String.valueOf(collect));
  }

 

听说JDK8之后toMap不会报NPE了,我看了一下JDK10.0.2的map::merge,还是有空校验…果然是个feature…

作者:傅晓芸
来源链接:https://www.cnblogs.com/niceboat/p/9679822.html

版权声明:
1、Java侠(https://www.javaxia.com)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaxia.com/server/124781.html

分享给朋友: