Java 8 Stream处理空值问题:薪资字段空值引发NPE
解决Person类salary字段null导致的NPE问题
这问题我熟!你遇到的NPE根源在于mapToDouble(Person::getSalary)的自动拆箱操作——当salary是null时,把Integer类型拆箱成基本类型double的步骤会直接抛出NullPointerException,而且原代码的写法本身就没法保留null值,因为mapToDouble会强制把所有值转成基本类型double,而基本类型是不支持存储null的。
方案1:保留Integer类型的列表(最直接)
如果你的需求是保留原有的Integer类型(包含null),直接用map替代mapToDouble即可,完全避免拆箱操作:
persons.stream() .map(Person::getSalary) .collect(Collectors.toList());
这个写法会直接将每个Person的salary(包括null)收集到List<Integer>中,没有任何拆箱操作,自然不会触发NPE。
方案2:获取Double类型的列表(保留null)
如果确实需要得到List<Double>同时保留null值,可以手动处理null情况,避免对null进行拆箱:
persons.stream() .map(person -> person.getSalary() != null ? person.getSalary().doubleValue() : null) .collect(Collectors.toList());
这里只有当salary不为null时才调用doubleValue()转成Double类型,null则直接保留,最终得到的List<Double>会包含所有原有的null值,同时不会抛出NPE。
内容的提问来源于stack exchange,提问作者Himanshu Yadav
相关产品推荐
相关产品推荐

