我从流中收集数据时遇到恼人的NullPointerException。在我看来,我不应该得到一个,这是困扰我的。
这是错误的代码:
descriptiveData
.stream()
.map(Signaletiques::getContrats)
.filter(Objects::nonNull)
.collect(Collectors.toList())
descriptiveData不为null且不包含空对象,但getContrats的结果可能是。这是一个非常有效的业务情况,我认为使用过滤器处理它是一种方法,但我能得到的只是这个例外:
引起:java.lang.NullPointerException at java.util.stream.ReferencePipeline $ 3 $ 1.accept(ReferencePipeline.java:193) 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) 在java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464) at be.formatech.forhrm.appipay.synchrosignaletique.service.impl.SynchronisationAppipayUcmIdFetcherImpl.searchWorkerIdThroughContractsData(SynchronisationAppipayUcmIdFetcherImpl.java:141)`
知道可能会发生什么吗?
编辑:
我真的很抱歉!
我在descriptiveData列表中确实有一个null,但是IntelliJ没有显示它:
感谢@Nikolas的回答确实是正确的。
答案 0 :(得分:3)
descriptiveData
确实包含null
值 - 之后可能会添加这些值。然后,您还需要过滤掉这些null
值。只需在.filter(..)
行之前添加另一个.map(..)
:
descriptiveData
.stream()
.filter(Objects::nonNull)
.map(Signaletiques::getContrats)
.filter(Objects::nonNull)
.collect(Collectors.toList())