JDK8 ——toMap空指针异常

jdk8 stream Tomap方法 空指针异常

  • 场景
  • 原代码
  • 解决方法
  • 额外

场景

统计所有产品,并且获取到每个产品对应的过期时间expireDay(),得到Map 类型结果。

原代码

		QueryProductListRequest productListRequest = new QueryProductListRequest();
//        productListRequest.setIsActive("1");
        List productInfoDtos = productInfoService.queryProductInfoList(productListRequest).getProductInfoDtos();
        Map productMap = productInfoDtos.stream().collect(Collectors.toMap(ProductInfoDto::getProductId, ProductInfoDto::getExpireDay));

数据库中的数据(仅展示过期时间字段):
JDK8 ——toMap空指针异常_第1张图片
最后两个产品的过期时间是空的,
本想着上面代码执行完毕,在最后两个产品会存入Map<,null>,结果抛出了异常,查看Collectors.toMap源码:
JDK8 ——toMap空指针异常_第2张图片
查看toMap:
JDK8 ——toMap空指针异常_第3张图片
merge方法:
JDK8 ——toMap空指针异常_第4张图片
此处标明若传递的value是空的话,则抛出空指针异常。
所有这就是抛异常的原因。

解决方法

Map productMap = productInfoDtos.stream().collect(Collectors.toMap(ProductInfoDto::getProductId, e -> Optional.ofNullable(e.getExpireDay()).orElse(2)));

Optional.ofNullable设置为空的时候默认值就好了,这样就不会有空值
JDK8 ——toMap空指针异常_第5张图片

额外

在调用toMap 方法时候
在这里插入图片描述
有个方法throwingMerger(),默认是抛出IllegalStateException异常
JDK8 ——toMap空指针异常_第6张图片
注释说明:

返回一个合并函数,该函数适用于 map merge(对象、对象、双功能)map.merge()或 tomap(function,function,binaryoperator)tomap(),它始终throws@code illegalStateException。这可以用来强制使所收集的元素是不同的。

这样的话,如果添加一个相同的key,想把上个key对应的value的挤出去,就会抛异常,,但是最终的merge方法调用的还是hashMap中的,hashMap中的是会把以前的值替换掉,要是不想被这个方法抛异常,可以这么写:

Map map = list.stream().collect(Collectors.toMap(ProductInfoDo::getProductId, ProductInfoDo::getExpireDay,(oldValue, newValue) -> newValue));

这样就会把原先的值替换掉了

你可能感兴趣的:(JDK8 ——toMap空指针异常)