Stream Collectors.toMap 当value为null时报空指针

devtools/2024/10/21 23:12:03/

文章目录

  • Stream Collectors.toMap 当value为null时报空指针
    • 问题
    • 源码
    • 解决

Stream Collectors.toMap 当value为null时报空指针

问题

java">public class Demo {public static void main(String[] args) {List<Test> list = new ArrayList<>();list.add(new Test("code1", "name1"));list.add(new Test("code2", null));Map<String, String> map = list.stream().collect(Collectors.toMap(Test::getCode, Test::getName));System.out.println(map);}
}@Data
@AllArgsConstructor
class Test {private String code;private String name;
}

执行结果:

java">Exception in thread "main" java.lang.NullPointerExceptionat java.util.HashMap.merge(HashMap.java:1226)at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1384)at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)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:566)at com.scj.test.Demo.main(Demo.java:15)

源码

java">public final class Collectors {public static <T, K, U>Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,Function<? super T, ? extends U> valueMapper) {return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);}public static <T, K, U, M extends Map<K, U>>Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,Function<? super T, ? extends U> valueMapper,BinaryOperator<U> mergeFunction,Supplier<M> mapSupplier) {BiConsumer<M, T> accumulator= (map, element) -> map.merge(keyMapper.apply(element),valueMapper.apply(element), mergeFunction);return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);}
}

Collectors.toMap 最终会调用 Map 的 merge 方法,这里会对value进行判空,如果为空,则抛出空指针异常。

java">public interface Map<K,V> {default V merge(K key, V value,BiFunction<? super V, ? super V, ? extends V> remappingFunction) {Objects.requireNonNull(remappingFunction);Objects.requireNonNull(value);	// 这里会对value判空,如果为空,则抛出NPEV oldValue = get(key);V newValue = (oldValue == null) ? value :remappingFunction.apply(oldValue, value);if(newValue == null) {remove(key);} else {put(key, newValue);}return newValue;}
}

解决

方案一:采用下面这种写法

java">Map<String, String> collect = list.stream().collect(HashMap::new, (m, v) -> m.put(v.getCode(), v.getName()), HashMap::putAll
);

方案二:对value进行判空,并给一个默认值

java">Map<String, String> map = list.stream().collect(Collectors.toMap(Test::getCode, e -> Optional.ofNullable(e.getName()).orElse("")
));

http://www.ppmy.cn/devtools/99464.html

相关文章

Kubernetes全名及其缩写K8S的正确读音

Kubernetes&#xff0c;在希腊语意为“舵手”或“驾驶员”&#xff0c;在IT技术领域&#xff0c;这是一个开源系统&#xff0c;支持部署、扩缩和管理容器化应用。正如船长负责船舶在海上的安全航行一样&#xff0c;Kubernetes担负着安全编排和运送容器&#xff08;可理解为船上…

【线性相关 vs 双变量回归】数据点在斜率周围的聚集程度与斜率本身并不是一回事。

相关性分析(具体来说,皮尔逊成对相关性)和回归分析(具体来说,双变量最小二乘 (OLS) 回归)具有许多共同的特征: 两者都定期应用于两个连续变量(我们称之为 X 和 Y)。通常向学生介绍这两种图表时使用的是同一类型的图表:散点图。二者从根本上讲都是关于 X 中的偏差(即…

Android常见界面控件(二)

目录 ​前言 一、 RadioButton控件 设置RadioGroup的监听事件 二、CheckBox控件 三、Toast类 改变Toast窗口的提示位置 四、EditText控件 常用属性 前言 在上一篇中&#xff0c;我们讲解了三个常见的控件&#xff1a;TextView控件、Button控件、ImageView控件&#xf…

Comsol 考虑波导的二维星形空穴型声子晶体线缺陷压电能量收集优化方案

参考文献&#xff1a;Yang X , Zhong J , Xiang J .Optimization scheme for piezoelectric energy harvesting in line-defect for 2D starlike hole-type phononic crystals considering waveguides[J].AIP Advances, 2022, 12(1):-. 利用声子晶体(PnC)增强弹性波能收集是电…

在线英语学习小程序App源码开发技术探讨

引言 随着信息技术的飞速发展和全球化进程的加快&#xff0c;英语学习已经成为越来越多人的日常需求。传统的纸质材料和课堂教学已经无法满足现代人灵活、高效的学习需求。因此&#xff0c;开发一款在线英语学习小程序App成为了一个热门话题。本文将从技术角度探讨在线英语学习…

电脑文件自动加解密如何实现?3个方法教会你!

电脑文件的自动加解密是一项非常实用的功能&#xff0c;可以帮助确保数据的安全性。 以下是三种实现电脑文件自动加解密的方法&#xff1a; 方法一&#xff1a;使用操作系统自带的加密功能 Windows BitLocker&#xff1a; 启用BitLocker&#xff1a;在Windows系统中&#xf…

基于springboot的养老院管理系统的设计与实现 (含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的养老院管理系统拥有多种角色账号&#xff1a;管理员和用户 管理员&#xff1a;管理员管理、用户管理、健康管理、病例方案管理、药品管理、餐饮管理、外出管理、入住管理…

谷歌登录的时候,要求在手机的通知点是,并按数字来验证身份,但是手机通知栏没有收到通知和数字,原因是什么,怎么办?

前两天&#xff0c;有个朋友联系到GG账号服务&#xff0c;说他的一个谷歌账号在新设备登录的时候&#xff0c;提示说要在手机的通知栏点击谷歌发来的通知&#xff0c;点击是确认&#xff0c;并且要点按相应的数字。 但问题是他反复刷新手机的通知栏都没有看到谷歌发来的通知&a…