Java 8 Java.stream().findAny()抛出NullpointerException

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

我的目标是检查集合中是否存在具有特定ID的对象:

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
即可立即再次装箱(并提高可读性)。