java 8 findFirst vs 可选 map

标签 java nullpointerexception java-8 java-stream option-type

给定这段代码:

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 valuesObject initialization in Java

初始化是不同的: A)类成员(对象和基元) B)局部变量

关于java 8 findFirst vs 可选 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44964706/

相关文章:

java - 使用多个 AsyncTask 或 HandlerThread(Pipeline Thread) 哪个更好?

java - 使用java将多个csv文件合并为一个文件?

java - 终端流操作,在Java 8中以map作为输入

java - Tomcat 7 和 8 无法在 YOSEMITE 和 Java JDK SE 8 下启动 - 缺少 ExtendedPlatformComponent

Java流——查找唯一元素

java - 如何在java中包装类并保存接口(interface)?

java - 如何识别 6 个月前的完整日期

java - 模拟对象上的 Mockito NullPointerException

android - 按钮不是从 XML 中获取的?空指针

android - 设置 OnClickListener 时出现 NullPointerException