给定这段代码:
class Foo {
Integer attr;
public Integer getAttr() {return attr;}
}
List<Foo> list = new ArrayList<>();
list.add(new Foo());
list.stream().map(Foo::getAttr).findAny().orElse(null); //A
list.stream().findAny().map(Foo::getAttr).orElse(null); //B
A线抛出
java.lang.NullPointerException: null
而 B 行返回 null。
这种行为的原因是什么?两者 findAny()
和 map()
返回 Optional<T>
.
最佳答案
list.stream().map(Foo::getAttr).findAny().orElse(null);
Java doc for streams说 Stream:“返回一个流,该流由将给定函数应用于此流的元素的结果组成”,并且 findAny()“可能返回一个 NullPointerException - 如果所选元素为 null”。在您的 Foo 类中,Integer(not int) 默认设置为 null,因为已声明但未初始化。见Primitives see default values和 Object initialization in Java
初始化是不同的: A)类成员(对象和基元) B)局部变量
关于java 8 findFirst vs 可选 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44964706/