【发布时间】:2015-11-10 09:23:42
【问题描述】:
我有一个 Stream 的字符串,并将每个字符串映射到 Optional<String>。由于我之后过滤了空的Optionals,因此返回的流应该只包含非空的Optionals 持有非空字符串。
那么为什么findFirst() 会抛出NullPointerException?
Optional<String> cookie =
Stream.of(headers.get(HttpHeaders.SET_COOKIE), headers.get(HttpHeaders.COOKIE))
.flatMap(Collection::stream)
.filter(s -> s.contains("identifier"))
.map(this::parseCookieValue) //returns an Optional<String> from Optional.ofNullable(), null-values should result in empty Optionals
.filter(Optional::isPresent) // filters out non-present values
.map(Optional::get) // all Optionals here should have values
.findFirst(); // so why is this still throwing a NullPointerException?
堆栈跟踪:
Caused by: java.lang.NullPointerException
at com.example.services.impl.RestServiceImpl$$Lambda$11/873175411.apply(Unknown Source)
at java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:267)
at java.util.Spliterators$ArraySpliterator.tryAdvance(Spliterators.java:958)
at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:529)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:516)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464)
at com.example.services.impl.RestServiceImpl.login(RestServiceImpl.java:81)
第 81 行是findFirst()-方法调用。
【问题讨论】:
-
您能否提供一个包含一些虚拟数据的可重现示例?
-
请提供异常的整个堆栈跟踪。我强烈怀疑 NPE 的真正原因不是
findFirst(但可能是s -> s.contains(...)lambda)。 -
@TagirValeev 这也是我的第一个想法。编写大量单行代码存在问题 - 调试起来有点困难......
-
附带说明,如果您只有两个列表,
Stream.concat(a.stream(), b.stream())比Stream.of(a, b).flatmap(Collection::stream)更简洁 -
@Blacklight,closevotes 的意思是“这个问题对更多的读者没有用”。你不应该担心他们,因为你已经解决了你的问题。实际上,如果您从一开始就发布堆栈跟踪,事情就会简单得多。现在我重新投票,因为我可以在答案中解释如何正确读取 Stream API 调用中出现的异常的堆栈跟踪。但我怀疑你会收集到足够多的重新开票。请记住未来:如果您问“为什么我看到这样的异常”,总是发布堆栈跟踪。
标签: java java-8 java-stream optional