Java8的Stream方法findAny空指针异常(NullPointerException)实例对比
实战介绍
学习完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,然后对Optional调用map方法获得的是Optional,而Optional里面的值为null,再调用orElse方法却不会出现问题。
调整操作
如果对原来的整个操作进行修改,则可正常执行,那就是设置Foo对象的id默认值不为null,或者给id赋值非null值。再次执行就不会出现异常。但这并不是解决问题的根本,只是为了演示结果。
原文链接:《Java8的Stream方法findAny空指针异常(NullPointerException)实例对比》
Java8新特性系列
Java8新特性系列相关文章:
- 《JAVA8新特性时间日期库DATETIME API及示例》
- 《JAVA8 LAMBDA表达式详解手册及实例》
- 《JAVA8 STREAM性能如何及评测工具推荐》
- 《JAVA8 STREAM新特性详解及实战》
- 《Java8新特性之空指针异常的克星Optional类》
关注公众号“程序新视界”,回复“001”,获得整个《Java8新特性系列》的PDF版本。
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接