首页 > 其他分享 >1-Collectors.toMap无法正确处理null值

1-Collectors.toMap无法正确处理null值

时间:2024-11-05 11:20:15浏览次数:1  
标签:toMap null Collectors existing dish DishCategoryAllPO

Collectors.toMap在在处理null值时,会出现NullPointerException

示例

DishCategoryAllPO d1 = new DishCategoryAllPO();
d1.setDishId(11111);
d1.setPrimaryLabel("11111");

DishCategoryAllPO d2 = new DishCategoryAllPO();
d2.setDishId(11111);

DishCategoryAllPO d3 = new DishCategoryAllPO();
d3.setDishId(22222);

DishCategoryAllPO d4 = new DishCategoryAllPO();
d4.setDishId(22222);
d4.setPrimaryLabel("22222");

DishCategoryAllPO d5 = new DishCategoryAllPO();
d5.setDishId(33333);

List<DishCategoryAllPO> list = Arrays.asList(d1, d2, d3, d4, d5);

Map<Integer, String> map = list.stream().collect(Collectors.toMap(DishCategoryAllPO::getDishId, DishCategoryAllPO::getPrimaryLabel,
        (existing, replacement) -> existing));

map.forEach((k,v) -> System.out.println(k+" "+v));

在这个例子中,d2和d5对象的primaryLabel属性没有被设置,即它们为null。当尝试将这些null值插入到Map中时,就会抛出NullPointerException。

原因
当尝试将null值插入到Map中时抛出NullPointerException的原因涉及到Jav 8 Collectors.toMap()方法的内部实现。具体来说:

  • Collectors.toMap()内部使用HashMap来存储结果。
  • 在Java 8中,HashMap的merge()方法被用来处理键值对的插入和合并。
  • merge()方法在处理值为null的情况时有一个特殊的逻辑:如果新值为null,它会尝试删除已存在的键值对。
  • 然而,在Collectors.toMap()的实现中,merge()方法被调用时假设了值永远不会为null。
  • 当遇到null值时,merge()方法会尝试对null执行操作,从而导致NullPointerException。


经验教训

  • 这个问题在Java 9中得到了修复,通过改变Collectors.toMap()的实现来正确处理null值。但在Java 8中,这个问题仍然存在。

  • Map<Integer, String> map = list.stream()
      .collect(Collectors.toMap(DishCategoryAllPO::getDishId, 
          dish -> dish.getPrimaryLabel() != null ? dish.getPrimaryLabel() : "默认值", // 提供默认值
          (existing, replacement) -> existing));
    
  • Map<Integer, String> map = list.stream()
      .filter(dish -> dish.getPrimaryLabel() != null) // 过滤掉primaryLabel为null的元素
      .collect(Collectors.toMap(DishCategoryAllPO::getDishId, DishCategoryAllPO::getPrimaryLabel,
          (existing, replacement) -> existing));
    

标签:toMap,null,Collectors,existing,dish,DishCategoryAllPO
From: https://www.cnblogs.com/greengages/p/18527505

相关文章

  • 深入浅出:AutoMapper 的使用与最佳实践
    在现代软件开发中,特别是在.NET环境中,数据传输对象(DTO)与实体模型之间的映射是一个常见的需求。AutoMapper是一个强大的库,可以简化这一过程,减少样板代码,提高开发效率。本文将详细讲解AutoMapper的基本概念、各种用法以及最佳实践。什么是AutoMapper?AutoMapper是一个对象到......
  • Day25--NullPointerException
    Day25--NullPointerException在Java中,NullPointerException(空指针异常)是一种常见的运行时异常。当你在代码中尝试访问一个为null(空值)的对象引用时,就会抛出这个异常。例如,你试图调用一个null对象的方法或者访问一个null对象的字段。以下是一个可能会引发NullPointerExce......
  • PyImport_ImportModule总是返回 NULL或者空调用失败pModule为空pFunc为空
    问题1pModule为空c++调用Python时,要调用Python自定义函数,但是在调用PyImport_ImportModule时,总是返回空。一直调用不成功,明明我已经通过pyList_append(syspath,目录路径)。但是就是找不到。正常用cmd脚本也能正常运行。解决方案//初始化Python解释器Py_Initialize();//......
  • 数据库 NULL 值对比运算符(null safe equal)
    在SQL的规定中,NULL是不等于NULL的,所以如果使用类似SELECTNULL=NULL这种语句,获取到的会是一个FALSE。但是有些时候我们又希望能够匹配到数据库中的NULL,通常写法是SELECTNULLISNULL,但是有没有能够同时兼容NULL和非NULL的情况呢?MySQLMySQL::MySQL5.7......
  • NullPointerException—配置属性为null
    1.问题描述空指针异常,获取属性配置类AliOssProperties中的endpoint属性时,为空。配置文件中正确配置了相关的属性,并且AliOssProperties上加了@ConfigurationProperties,启动类上通过@EnableConfigurationProperties(AliOssProperties.class)启用了配置属性支持。Errorstarti......
  • Spring Boot 依赖注入为 null 问题
    目录问题省流代码复现TestServiceTestAspectTestController源码分析AbstractAutoProxyCreatorCglibAopProxyEnhancer问题工作中,在负责的模块里使用@DubboService注解注册了一个dubbo接口,给定时任务模块去调用。在自我调试阶段,需要在本地自己验证一下接口的功......
  • C++(nullptr、类型推导、初始化列表、)
    1.nullptr(掌握)nullptr是C++11推出的新的空指针,用于代替C语言的NULL。#include<iostream>usingnamespacestd;voidfunc(inti){cout<<"A"<<i<<endl;}voidfunc(char*c){cout<<"B"<<c<<en......
  • UE-GAS CreateDefaultSubobject<UAbilitySystemComponent>返回为nullptr
    前因原先在项目中用了默认的ASC(UAbilitySystemComponent),后面因为新的需求导致需要改为自己的ASC。结果改了之后,发现在Pre-Init(构造函数)时,CreateDefaultSubobject的返回值是nullptr。过程于是去论坛求助:论坛的人的回答是,你修改了ASC的类,导致前一个ASC反序列化到当前ASC上,从而......
  • 如何使用SQL函数处理和清理输入数据中的NULL值?
    处理和清理输入数据中的NULL值是一个重要的主题。NULL值代表未知或缺失的数据,这可能会影响数据分析的准确性。因此,在进行任何分析之前,正确地处理这些NULL值是至关重要的。以下是一些常用的方法来处理和清理输入数据中的NULL值,并附带了详细的例子。1.使用COALESCE函数COAL......
  • java.lang.UnsupportedOperationException: null
    问题描述:在Java中,当你遇到 java.lang.UnsupportedOperationException 这个异常时,通常意味着你尝试在一个不支持该操作的集合上执行了一个操作。在这个具体的例子中,问题很可能出在 toList() 方法的使用上,以及后续对列表的修改。List<Long>ids=dtos.stream(......