Java流findAny()在filter()操作过滤掉所有内容后遇到空指针异常

标签 java java-8 java-stream

我无法理解为什么 findAny() 在对流进行 filter() 操作后抛出空指针异常。在这个特定的测试用例中,过滤操作应该过滤掉所有内容,不为 findAny() 留下任何结果。

Optional<JsonNode> encryption = sseEncryptionList.stream()
                  .filter(n -> n.textValue().equals("AES256")) //Filters out everything
                  .findAny(); //Throws null pointer exception

堆栈跟踪:

Exception in thread "main" java.lang.NullPointerException
at example.Main.lambda$main$0(Main.java:41)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
at java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1351)
at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.findAny(ReferencePipeline.java:469)
at example.Main.main(Main.java:42)

如果流不包含任何元素,findAny() 是否会抛出空指针异常?

编辑:解决可能过滤掉所有元素的过滤操作的优雅而实用的方法是什么?

最佳答案

避免NPE最好的方法是:

Optional<JsonNode> encryption = sseEncryptionList.stream()
              .filter(Objects::nonNull)
              .filter(n -> "AES256".equals(n.textValue()))
              .findAny();

"AES256".equals(n.textValue())) 如果 n.textValue() 为空则不会抛出 NPE

关于Java流findAny()在filter()操作过滤掉所有内容后遇到空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47081966/

相关文章:

java - 如何从嵌套的 ArrayList 访问特定元素

java - StringIndexOutOfBoundsException 错误

java - Reduce 为并行流返回不可预测的结果

java - 为 MongoDB 淘汰 Hibernate/Mysql 或为 Java/Spring/Tomcat Web 应用程序淘汰 Couch

java - Groovy 中字符串的增量运算符

java - 通过HQL从两个表中获取数据并插入到一个表中

java - DirectoryStream 为空,即使目录中有文件

java - 使用 Twilio SDK 将电话号码 "+2125551212"转换为格式 "(212) 555-1212"

java - 映射到 Java 8 中的运行总和

java - 在 Java 8 中测试 Lambda