【发布时间】:2018-08-25 13:55:25
【问题描述】:
我有:
List<Optional<MyObject>> myList;
此列表是通过从文件中读取来填充的。文件读取完成后,我会检查空列表:
if(myList.size() == 0){//}
然后进行如下操作:
myList.stream()
.filter(Optional::isPresent)
.map(i → i.orElse(new MyObject(“adventureBook”, 20))
.collect(groupingBy(MyObject::getBookType, TreeMap::new, mapping(MyObject::getBookPrice, toList())));
我有大约 350k MyObject 文件要读取,300k 文件可以正常读取,但是当我尝试读取整批 c.350k 文件时,它会在 collect() 上引发空指针异常。
怎么可能尽管包装在 Optional 并检查 Optional::isPresent、Optional::orElse 等仍然有一个空对象设法偷偷溜过,并且考虑到我有这么多的文件,最好的方法是什么尝试缩小错误文件的范围?谢谢
编辑:添加堆栈跟踪
Exception in thread "main" java.lang.NullPointerException
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at com.mypackage.MyObject.main(MyObject.java:108)
【问题讨论】:
-
你能发布堆栈跟踪吗?
-
拥有一个可选项列表已经很奇怪了,不存在的对象一开始就不应该出现在列表中。
-
即使有一个
MyObject为空,将那些20(s) 收集到List也是一个相当有趣的选择:) 如果有一本真正的书怎么办(adventureBook) 价格为20?你将如何在两者之间做出改变? -
如果您将
null添加到该列表而不是Optional.empty(),则Optional不会神奇地保护您免受NullPointerException的侵害。