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

当试图使用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…

最新文章

  1. Python 中的枚举类型~转
  2. htm5l,第一个script代码练习
  3. 前端上传组件Plupload使用指南
  4. ListView中使用type需要注意的东西
  5. 09_Java8操作集合的一些新特性
  6. Hibernate的fetch (转)
  7. sysbench的安装与使用
  8. C++ pair 使用方法
  9. DWR异步产生的问题
  10. 探讨数据进行AES加密和解密以及.NET Core对加密和解密为我们提供了什么?
  11. 新人学习selenium哪些资源比较有帮助?
  12. web性能优化之--合理使用http缓存和localStorage做资源缓存
  13. FastReport报表MVC显示步骤
  14. gitignore规则探究
  15. ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  16. 安装PostGIS 2.1.1 时遇到checking for library containing GDALAllRegister... no
  17. Maven学习(一)概念简述和安装教程
  18. WordPress主题开发:get_term_by和get_term_link
  19. 源码分析七(java.lang包之IllegalArgumentException类)
  20. (转)C++ 容器及选用总结

热门文章

  1. 2018.2.27 JavaScript数组方法应用
  2. 用 label 控制 Pod 的位置
  3. Luogu P1666 前缀单词
  4. Bootstrap历练实例:默认的列表组
  5. 01_1_Socket实现
  6. lua 使用递归查找键值
  7. javascript原型继承圣杯模式
  8. ERROR 1045 (28000): Access denied for user &#39;xxx&#39;@&#39;localhost&#39; (using password: YES) MYSQL 新建用户 无法登录 问题解决方法
  9. php进行文件的强制下载
  10. windows server 服务器 环境配置