實戰介紹
學習完Java8的Stream方法,可能你正准備大展身手,卻發現遇到不少問題,本篇文章為大家帶來一個findAny方法拋出java.lang.NullPointerException的場景。
實戰內容
先看一下下面的代碼,猜測一下執行之后會打印什么?
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
調整操作
如果對原來的整個操作進行修改,則可正常執行,那就是設置Foo對象的id默認值不為null,或者給id賦值非null值。再次執行就不會出現異常。但這並不是解決問題的根本,只是為了演示結果。
原文鏈接:《Java8的Stream方法findAny空指針異常(NullPointerException)實例對比》