我是靠谱客的博主 感动奇迹,最近开发中收集的这篇文章主要介绍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);
最后
以上就是感动奇迹为你收集整理的Java8 Stream 操作 Collectors.toMap()会出现NullPointerException异常的全部内容,希望文章能够帮你解决Java8 Stream 操作 Collectors.toMap()会出现NullPointerException异常所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复