stream.filter 对我的列表<Objects> 中的某些对象不起作用,是否有任何解决方案或其他方法?
stream.filter is not working for some objects in my List<Objects>, is there any solution or other method?
我为对象列表创建了一个过滤器,并在此列表中搜索一个对象的名称:tables.getTable().stream().filter(p->p.geName().equals(referenceName)).findAny;
referenceName
不是 null
并且包含此名称的对象存在于列表中,但会导致错误,结果如下:
java.lang.NullPointerException at
comparator.complex.obj.comparison.XmlObjComparison.lambda$XmlObjectsComparison(XmlObjComparison.java:359)
at
java.base/java.util.stream.MatchOpsMatchSink.accept(MatchOps.java:90)
at
java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1632)
at
java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127)
at
java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502)
at
java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488)
at
java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at
java.base/java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230)
at
java.base/java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196)
at
java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at
java.base/java.util.stream.ReferencePipeline.noneMatch(ReferencePipeline.java:538)
at
comparator.complex.obj.comparison.XmlObjComparison.XmlObjectsComparison(XmlObjComparison.java:359)
at
comparator.complex.obj.comparison.XmlObjComparison.test2(XmlObjComparison.java:584)
at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native
Method) at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566) at
org.junit.runners.model.FrameworkMethod.runReflectiveCall(FrameworkMethod.java:50)
at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner.run(ParentRunner.java:290) at
org.junit.runners.ParentRunner.schedule(ParentRunner.java:71) at
org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at
org.junit.runners.ParentRunner.access[=15=]0(ParentRunner.java:58) at
org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268) at
org.junit.runners.ParentRunner.run(ParentRunner.java:363) at
org.junit.runner.JUnitCore.run(JUnitCore.java:137) at
com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at
com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at
com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
有什么可能?因为在某些情况下它有效,而在另一些情况下它无效!
tables.getTable().stream().filter(p->p.geName().equals(referenceName)).findAny;
一定是p.geName()
返回null。尝试 Objects.equals(referenceName, p.geName())
或 referenceName.equals(p.geName())
或进行空检查。另外,我假设 findAny
是一个方法调用,但你排除了括号。澄清一下:我并不是说 p
为空,而是 p.geName()
的结果可能为空。如果是,那么调用 .equals()
显然会产生 NullPointerException
.
如果您的问题仍未解决,您将不得不提供更多信息,例如您如何创建流、您尝试做什么、p
变量甚至是什么以及p
的 class.
的结构
您应该使用 Stream::peek
来调试应用程序并使用额外的过滤器或空值检查:
tables.getTable() // some collection
.stream()
.peek(p -> System.out.println("1: p=" + Objects.toString(p))) //
.filter(Objects::nonNull) // make sure p is not null
.peek(p -> System.out.println("2: p.name=" + Objects.toString(p.getName()))) //
.filter(p -> Objects.equals(referenceName, p.getName()))
.findAny();
仅仅是空检查
tables.getTable() // some collection
.stream()
.filter(p -> p != null && Objects.equals(referenceName, p.getName()))
.findAny();
我为对象列表创建了一个过滤器,并在此列表中搜索一个对象的名称:tables.getTable().stream().filter(p->p.geName().equals(referenceName)).findAny;
referenceName
不是 null
并且包含此名称的对象存在于列表中,但会导致错误,结果如下:
java.lang.NullPointerException at comparator.complex.obj.comparison.XmlObjComparison.lambda$XmlObjectsComparison(XmlObjComparison.java:359) at java.base/java.util.stream.MatchOpsMatchSink.accept(MatchOps.java:90) at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1632) at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127) at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) at java.base/java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230) at java.base/java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.noneMatch(ReferencePipeline.java:538) at comparator.complex.obj.comparison.XmlObjComparison.XmlObjectsComparison(XmlObjComparison.java:359) at comparator.complex.obj.comparison.XmlObjComparison.test2(XmlObjComparison.java:584) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.junit.runners.model.FrameworkMethod.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner.run(ParentRunner.java:290) at org.junit.runners.ParentRunner.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access[=15=]0(ParentRunner.java:58) at org.junit.runners.ParentRunner.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
有什么可能?因为在某些情况下它有效,而在另一些情况下它无效!
tables.getTable().stream().filter(p->p.geName().equals(referenceName)).findAny;
一定是p.geName()
返回null。尝试 Objects.equals(referenceName, p.geName())
或 referenceName.equals(p.geName())
或进行空检查。另外,我假设 findAny
是一个方法调用,但你排除了括号。澄清一下:我并不是说 p
为空,而是 p.geName()
的结果可能为空。如果是,那么调用 .equals()
显然会产生 NullPointerException
.
如果您的问题仍未解决,您将不得不提供更多信息,例如您如何创建流、您尝试做什么、p
变量甚至是什么以及p
的 class.
您应该使用 Stream::peek
来调试应用程序并使用额外的过滤器或空值检查:
tables.getTable() // some collection
.stream()
.peek(p -> System.out.println("1: p=" + Objects.toString(p))) //
.filter(Objects::nonNull) // make sure p is not null
.peek(p -> System.out.println("2: p.name=" + Objects.toString(p.getName()))) //
.filter(p -> Objects.equals(referenceName, p.getName()))
.findAny();
仅仅是空检查
tables.getTable() // some collection
.stream()
.filter(p -> p != null && Objects.equals(referenceName, p.getName()))
.findAny();