学习完Java8的Stream方法,可能你正准备大展身手,却发现遇到很多问题,本篇文章为你们带来一个findAny方法抛出java.lang.NullPointerException的场景。java
先看一下下面的代码,猜想一下执行以后会打印什么?bash
public class FindAnyTest {
@Test
public void test() {
List<Foo> list = new ArrayList<>();
list.add(new Foo());
// 方法一
Integer id = list.stream().map(Foo::getId).findAny().orElse(null);
System.out.println(id);
// 方法二
id = list.stream().findAny().map(Foo::getId).orElse(-1);
System.out.println(id);
}
}
class Foo {
Integer id;
public Integer getId() {
return this.id;
}
}
复制代码
而后,执行单元测试方法,你会发现方法一抛出了异常:微信
java.lang.NullPointerException
复制代码
若是删除方法一,只执行方法二,则不会出现异常。为何呢?单元测试
首先方法一种,list.stream().map(Foo::getId)经过map,对原来的Stream进行了转换,生成了一个新的Stream,而该Stream中值是Foo的id属性,默认为null。针对一个元素为null的Stream调用findAny(),固然就抛出异常了。学习
而方法二,list.stream().findAny()得到是Optional,而后对Optional调用map方法得到的是Optional,而Optional里面的值为null,再调用orElse方法却不会出现问题。测试
若是对原来的整个操做进行修改,则可正常执行,那就是设置Foo对象的id默认值不为null,或者给id赋值非null值。再次执行就不会出现异常。但这并非解决问题的根本,只是为了演示结果。ui
原文连接:《Java8的Stream方法findAny空指针异常(NullPointerException)实例对比》this