【发布时间】:2020-03-13 19:58:22
【问题描述】:
当列表的元素为零并避免在stream().filter() lambda 函数中迭代时,我正在寻找解决方案,例如:
List<Person> list = new ArrayList<>();
list.stream().filter(element -> element.getProperty().equals("bla").findFirst().get();
如果列表大小为零,但程序不为空,则程序会抛出 NullPointerException。
所以我使用传统的解决方案来检查 list 是否为 empty,例如:
if(list.size()> 0 )
list.stream.filter( .....
您知道不使用传统 if 检查的不同解决方案吗?
更新
很抱歉报告异常,实际上,异常是一个
java.util.NoSuchElementException:不存在值
而不是NullPointerExcption。
更新 2
所以正如VGR所说,我会改进代码
List<Person> list = new ArrayList<>();
list.stream().filter(element -> element.getName().equals("bla").findFirst().get();
还有 Person 类:
public class Person {
String name;
public getName(){
return this.name;
}
}
【问题讨论】:
-
这不是真的。在空列表上调用
stream()将导致 Stream 永远不会调用其过滤器,并且 findFirst() 将始终返回一个空的 Optional。您根本不应该检查尺寸。请提供一个minimal reproducible example 来演示空列表如何生成 NullPointerException。 -
您正在对一个空的可选选项调用 .get() .....
-
你的问题还是有点糊涂。 A Minimal, Reproducible Example 真的很有帮助。请先自己运行它,以便确定它是可编译和可重现的。
-
如果
element或element.getProperty()可能是null,则第一个代码块中可能会发生NPE。另一方面,第二个块中的 NSEE 只能发生在filter没有更多元素之后的流中,并导致终端操作findFirst的Optional.empty。 -
java.util.NoSuchElementException表示您在getting 的值是一个空的可选项!看看 Andronicus 的回答...
标签: java arraylist lambda java-8 java-stream