zoukankan      html  css  js  c++  java
  • 使用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…

  • 相关阅读:
    17. 偏函数
    16. 装饰器
    vim详解
    linux用户管理sudo 磁盘分区
    linux用户管理
    linux文件与目录(四)
    linux特殊权限
    linux文件和目录(二)
    linux文件和目录
    配置网络
  • 原文地址:https://www.cnblogs.com/niceboat/p/9679822.html
Copyright © 2011-2022 走看看