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

简介: 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

1

如果删除方法一,只执行方法二,则不会出现异常。为什么呢?


具体分析

首先方法一种,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类》


目录
相关文章
|
10月前
|
安全 Java 开发者
告别NullPointerException:拥抱Java Optional
告别NullPointerException:拥抱Java Optional
|
10月前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
|
10月前
|
安全 Java 开发者
NullPointerException:拥抱Java Optional-6
NullPointerException:拥抱Java Optional
337 104
|
10月前
|
安全 Java 容器
NullPointerException:拥抱Java Optional-5
NullPointerException:拥抱Java Optional
352 107
|
10月前
|
安全 Java 开发者
告别NullPointerException:拥抱Java Optional-4
告别NullPointerException:拥抱Java Optional-4
330 104
|
10月前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
430 100
|
10月前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
397 101
|
10月前
|
并行计算 Java 大数据
Java Stream API:现代数据处理之道
Java Stream API:现代数据处理之道
506 101
|
9月前
|
安全 Java 开发者
告别NullPointerException:掌握Java Optional的精髓
告别NullPointerException:掌握Java Optional的精髓
|
9月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
544 18