Java 8流:处理空值

4
以下代码由于 Salary 属性为空指针而抛出 NPE 异常。 类 Person 包含以下属性:字符串类型的 name,整数类型的 age 和 salary。在此处 salary 可能为空。我想要创建一个工资列表。 persons.stream().mapToDouble(Person::getSalary).boxed().collect(Collectors.toList())
在这里,我必须保留结果列表中的空值。不能用 0 替换空值。

这里我必须保留,你可能会使用更多的 null 做什么?除非是应该移除。 - Eugene
1
你首先需要像往常一样阅读异常的堆栈跟踪。是什么导致了这个异常?值是否为空?getProperty()是否抛出了它?是该方法中的一个错误吗?还是你发布的代码中有一个错误?期望的结果是什么?从回答所有这些问题开始。它被downvoted是因为你没有费心发布堆栈跟踪和相关代码,使你的问题不清楚,并且似乎你没有尝试任何自己修复错误的方法。 - JB Nizet
5
我不认为这是一个重复的问题——OP想要保留空值,而不是过滤它们。 - Oliver Charlesworth
1
@Turing85 感谢你的提醒。但在提问之前,我已经进行了研究。我花了更多的时间来解释问题。 - Himanshu Yadav
4
@HimanshuYadav,这不是关于我们,而是关于你发布问题的方式。如果你提供了一个清晰的例子,那么这将成为一个好问题,但你没有提供。 - Eugene
显示剩余6条评论
2个回答

10

我认为你可以使用三元运算符,而不是mapToDouble,并结合使用map

List<Double> salaries = persons.stream()
    .map(Person::getSalary)
    .map(s -> s == null ? null : s.doubleValue())
    .collect(Collectors.toList())

1
或者 persons.stream() .map(p->(p.getProperty()!= null)?new Double(p.getProperty()):null) .collect(Collectors.toList()); - Hadi J
2
@HadiJ 调用 getProperty() 两次看起来对我并不是一种改进。此外,你永远不应该使用 new Double(…),而应该使用自动装箱或 Double.valueOf。从Java 9开始,构造函数已被标记为已弃用以提醒您。如果您想要一个单独的 map 步骤,可以使用 .map(p -> Optional.ofNullable(p.getSalary()).map(Integer::doubleValue).orElse(null)),但我更喜欢这个答案的代码。 - Holger

3

如果我理解正确,您希望在属性值不为null时将其转换为Double,或在其为null时将其保留为null。因此,请明确说明:

Integer prop = value.getProperty();
return (prop != null) ? prop.doubleValue() : null;

你可以将其表达为lambda表达式,并将其传递给map()函数。(留给读者作为练习)。

我对流的语法不是很熟悉。我该如何在映射中使用 value.getProperty() - Himanshu Yadav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接