Java8的Stream方法findAny空指针异常NullPointerException实例对比

7次阅读

共计 1005 个字符,预计需要花费 3 分钟才能阅读完成。

实战介绍

学习完 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>,然后对 Optional<Foo> 调用 map 方法获得的是 Optional<Integer>,而 Optional<Integer> 里面的值为 null,再调用 orElse 方法却不会出现问题。

调整操作

如果对原来的整个操作进行修改,则可正常执行,那就是设置 Foo 对象的 id 默认值不为 null,或者给 id 赋值非 null 值。再次执行就不会出现异常。但这并不是解决问题的根本,只是为了演示结果。

原文链接:《Java8 的 Stream 方法 findAny 空指针异常(NullPointerException)实例对比》

<center> 程序新视界 :精彩和成长都不容错过 </center>

正文完
 0