Java8 Stream 操作 Collectors.toMap()会出现NullPointerException异常

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$3ReducingSink.accept(ReduceOps.java:169)
	at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
	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)
	at com.example.stream.test.Test.main(Test.java:25)
当要转化的map的value值中包含空指针的情况时,会在merge()时出现。场景还原:

 Stream<User> userStream = Stream.of(new User("a", 1),
                new User("b", 2),
                new User("c", null));

userStream.collect(Collectors.toMap(User::getName, User::getAge));
解决方法
  • 设置时加判断如果是null,则设置成一个特定值;
  • 使用collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner) 来构建,此时可允许null值的出现;
  • 使用Optional<T>对值进行包装。
1、设置时加判断如果是null,则设置成一个特定值
 Map<String, Integer> collect = userStream
                .collect(Collectors.toMap(User::getName, user -> user.age == null ? 0 : user.age));

2、 使用collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner) 来构建,此时可允许null值的出现
 Map<String, Integer> map = userStream
                .collect(HashMap::new, (n, v) -> n.put(v.getName(), v.getAge()), HashMap::putAll);
3、使用Optional<T>对值进行包装
Map<String, Optional<Integer>> map = userStream
                .collect(Collectors.toMap(User::getName, user -> Optional.ofNullable(user.getAge())));
        Integer age = map.get("a").orElse(0);
  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值