在filter()操作过滤掉所有内容后,Java streams findAny()遇到空指针异常
我很难理解为什么在filter()操作过滤掉所有内容后,Java streams findAny()遇到空指针异常,java,java-8,java-stream,Java,Java 8,Java Stream,我很难理解为什么findAny()在流上的filter()操作之后抛出空指针异常。在这个特定的测试用例中,filter操作应该过滤掉所有内容,不会为findAny()留下任何结果 如果流不包含任何元素,则findAny()是否会引发空指针异常 编辑:解决可能过滤掉所有元素的过滤操作的优雅而实用的方法是什么?您的困惑来自这样一个事实:您首先过滤了filter,并且您希望filter方法位于堆栈跟踪的某个位置;但请注意,中间操作本身并没有任何作用,它们是惰性地执行的,并且只有在存在终端操作时才会启动
findAny()
在流上的filter()
操作之后抛出空指针异常。在这个特定的测试用例中,filter操作应该过滤掉所有内容,不会为findAny()
留下任何结果
如果流不包含任何元素,则findAny()
是否会引发空指针异常
编辑:解决可能过滤掉所有元素的过滤操作的优雅而实用的方法是什么?您的困惑来自这样一个事实:您首先过滤了
filter
,并且您希望filter
方法位于堆栈跟踪的某个位置;但请注意,中间操作本身并没有任何作用,它们是惰性地执行的,并且只有在存在终端操作时才会启动(在您的例子中,例如findAny
)。它实际上在堆栈跟踪中(过滤方法中),但看起来是这样的:Example.Main.lambda$Main$0(Main.java:41)
如果要筛选空值,请首先执行以下操作:
.filter(Objects::nonNull)
.filter(n -> n.textValue().equals("AES256"))
.findAny()
不,这不是行为,当流不包含任何元素时。在这种情况下,它会返回一个可选的.empty()
此外,NPE是流中出现空值的原因,如中所述:
避免NPE的最佳方法是:
Optional<JsonNode> encryption = sseEncryptionList.stream()
.filter(Objects::nonNull)
.filter(n -> "AES256".equals(n.textValue()))
.findAny();
Optional encryption=sseEncryptionList.stream()
.filter(对象::非空)
.filter(n->“AES256”.equals(n.textValue()))
.findAny();
“AES256”.equals(n.textValue())
如果n.textValue()为null,则不会抛出NPE如果要过滤null,只需使用过滤器(Objects::nonNull)
,正如我在回答中所说的。实际上,过滤lambda在堆栈跟踪中(在example.Main.lambda$Main$0(Main.java:41)
)-所以异常被抛出那里findAny
恰好是跟踪中最外层的函数。@Cthulhu-thx,这就是我的意思。很难更改尿布并回答:)将编辑…当n.textValue()返回null时会发生什么?我的意思是需要filter(Objects::nonNull)
,但下一行可以在n.textValue()
returnnull
@YegorBabarykin时抛出NPE。如果您是正确的,您可以在这种情况下简单地反转等式:n->“AES256”.equals(n.textValue())
.filter(Objects::nonNull)
.filter(n -> n.textValue().equals("AES256"))
.findAny()
Returns:
an Optional describing some element of this stream, or an empty Optional if the stream is empty
Throws:
NullPointerException - if the element selected is null
Optional<JsonNode> encryption = sseEncryptionList.stream()
.filter(Objects::nonNull)
.filter(n -> "AES256".equals(n.textValue()))
.findAny();