JDK8 Stream API中Collectors中toMap方法的问题以及解决方案

使用Collectors.toMap方法时的两个问题:

1、当key重复时,会抛出异常:java.lang.IllegalStateException: Duplicate key **
2、当value为null时,会抛出异常:java.lang.NullPointerException

首先这个不是JDK的bug,只是不符合我们的预期。

大家通常希望这个方法是可以容错的,遇到重复的key就使用后者替换,而且HashMap的value可以是null。

下面举个小例子。

首先是元素类Emp:

然后是测试类:

生成10个对象,其中id只能为0,1,2,用id做key,name做value,运行结果如下:

提示key重复了。

接下来看另一种情况:

这个是让emps数组中出现两个value为null的元素,运行结果如下:

提示value是null。

这个是因为调用了HashMap的merge方法,方法不接受这种数据。因此需要手动实现,实现方式也很简单,只要调用map的put方法就可以了。

测试类如下:

包含了上面两种可能产生异常的情况,运行结果如下:

解决了上面的问题,满足了容错需求。

由于Stream API用的不是很广泛,如果网友们有更好的实现方案,希望告知,多谢!

打赏支持我写出更多好文章,谢谢!

打赏作者

打赏支持我写出更多好文章,谢谢!

任选一种支付方式

1 1 收藏 7 评论

关于作者:theboboy

一名Java攻城狮,喜欢研究相关的技术,对计算机的任何方面都感兴趣。真正的全栈,买硬件,装机,装系统,装软件,搭服务器,搭分布式,搭集群,操作数据库,搭框架,设计,写后端,写前端,单元测试,集成测试,联调,部署,优化。 个人主页 · 我的文章 · 9 ·  

相关文章

可能感兴趣的话题



直接登录
最新评论
  • 1.针对重复key的  覆盖之前的value

    Stream.of(emps).collect(Collectors.toMap(Emp::getId, Emp::getName,(k,v)->v));

    2.value为空,直接存放  不调用map.merge。同样适用于1(key重复的情况)

    Stream.of(emps).collect(Collector.of(HashMap::new, (m,emp)->m.put(emp.getId(),emp.getName()), (k,v)->v, Characteristics.IDENTITY_FINISH));

    其中lambda表达式: (k,v)->v   不会被调用,但是又不能为空  此处略囧

  • filter之后在collect

跳到底部
返回顶部