Java 8 Java.stream().findAny()抛出NullpointerException
我的目标是检查集合中是否存在具有特定ID的对象:Java 8 Java.stream().findAny()抛出NullpointerException,java-8,java-stream,Java 8,Java Stream,我的目标是检查集合中是否存在具有特定ID的对象: Optional<PolicyCoHolder> policyHolder = policyCoHolderCollection.getPolicyCoHolder() .stream() .filter(coHolder -> coHolder.getPolicyCoHolderId().longValue() == representativeId) .findAny(); policyCoHold
Optional<PolicyCoHolder> policyHolder = policyCoHolderCollection.getPolicyCoHolder()
.stream()
.filter(coHolder -> coHolder.getPolicyCoHolderId().longValue() == representativeId)
.findAny();
policyCoHolder = {ArrayList@17539} size = 3
0 = {PolicyCoHolder@17541}
1 = {PolicyCoHolder@17542}
2 = {PolicyCoHolder@17543}
和代表性ID:
representativeId = null
如文件所述:
返回:描述此流的某些元素的可选值,或
如果流为空,则为empty可选
抛出:NullPointerException-如果所选元素为null
但是在我的集合中没有空元素,.filter()应该过滤掉所有元素,那么为什么会抛出NPE
java.lang.NullPointerException: null
at gold.core.domain.mtpl.mapper.MTPLMapper.lambda$addPolicyCoHolder$1(MTPLMapper.java:303)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
at java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1359)
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)
它看起来像是
coHolder
是null
或coHolder.getPolicyCoHolderId()
返回null
。尝试在原始筛选器之前添加其他筛选器
:
Optional<PolicyCoHolder> policyHolder = policyCoHolderCollection.getPolicyCoHolder()
.stream()
// will filter out all nulls in the stream
.filter(Objects::nonNull)
// compare values finally, Object::equals can handle null checks properly
.filter(coHolder -> Objects.equals(coHolder.getPolicyCoHolderId(),representativeId))
.findAny();
Optional policyHolder=policycholdercollection.getpolicycholder()
.stream()
//将过滤掉流中的所有空值
.filter(对象::非空)
//比较值最后,Object::equals可以正确处理空检查
.filter(coHolder->Objects.equals(coHolder.getPolicyCoHolderId(),representativeId))
.findAny();
当然,我们可以将所有3个过滤器合并为1个,但在我看来,它的可读性较差 它看起来像
coHolder
是null
或coHolder.getPolicyCoHolderId()
返回null
。尝试在原始筛选器之前添加其他筛选器
:
Optional<PolicyCoHolder> policyHolder = policyCoHolderCollection.getPolicyCoHolder()
.stream()
// will filter out all nulls in the stream
.filter(Objects::nonNull)
// compare values finally, Object::equals can handle null checks properly
.filter(coHolder -> Objects.equals(coHolder.getPolicyCoHolderId(),representativeId))
.findAny();
Optional policyHolder=policycholdercollection.getpolicycholder()
.stream()
//将过滤掉流中的所有空值
.filter(对象::非空)
//比较值最后,Object::equals可以正确处理空检查
.filter(coHolder->Objects.equals(coHolder.getPolicyCoHolderId(),representativeId))
.findAny();
当然,我们可以将所有3个过滤器合并为1个,但在我看来,它的可读性较差 向问题添加异常堆栈跟踪。最有可能的是
coHolder.getPolicyCoHolderId()
返回null
,但如果没有实际的异常就无法判断。@M.Prokhorov用堆栈跟踪更新了问题。是的,正如我所怀疑的coHolder.getPolicyCoHolderId().longValue()==representativeId
引发异常。有两种可能:getPolicyCoHolderId()
返回null
或representativeId
为null
(如果这不是原语,我现在无法知道)。是的,representativeId为null,我错过了它不是原语的信息……为问题添加异常堆栈跟踪。最有可能的是coHolder.getPolicyCoHolderId()
返回null
,但如果没有实际的异常就无法判断。@M.Prokhorov用堆栈跟踪更新了问题。是的,正如我所怀疑的coHolder.getPolicyCoHolderId().longValue()==representativeId
引发异常。有两种可能性:getPolicyHolderID()
返回null
或representativeId
为null
(如果这不是原语,我现在无法知道)。是的,representativeId为null,我忽略了它不是原语……问题是representativeId很长,而且为null。这就是我发现异常的地方。我太专注于流和集合了,以至于错过了它……当你使用.filter(coHolder->Objects.equals(coHolder.getPolicyCoHolderId(),representativeId))
(没有.longValue()
),你就不需要前面的.filter(coHolder->Objects.nonNull(coHolder.getPolicyCoHolderId())
,这是对对象的过度使用。coHolder.getPolicyCoHolderId()!=null
比对象更简单。nonNull(coHolder.getPolicyCoHolderId()
@Holger,通常你是对的。对象::equals
处理空情况。@AntonBalaniuc,无需执行longValue()
Objects::equals
只接受已装箱的值,无需取消装箱policycholderid
即可立即再次装箱(并提高可读性)。问题是representativeId很长,并且为空。我就是在这里发生异常的。我太专注于流和集合,以至于错过了它…当您使用.filter(coHolder->Objects.equals(coHolder.getPolicyCoHolderId(),representativeId))
(没有.longValue()
),那么您就不需要前面的.filter(coHolder->Objects.nonNull(coHolder.getPolicyCoHolderId())
,顺便说一句,这就是过度使用对象方法。coHolder.getPolicyCoHolderId()!=null
比对象更简单。nonNull(coHolder.getPolicyCoHolderId())
@Holger,像往常一样,你是对的。Object::equals
处理空情况。@AntonBalaniuc,无需执行longValue()
Objects::equals
只接受装箱的值,无需取消装箱policyCoHolderId
即可立即再次装箱(并提高可读性)。