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新特性系列相关文章:

关注公众号“程序新视界”,回复“001”,获得整个《Java8新特性系列》的PDF版本。


程序新视界

关注程序员的职场生涯,大量优质学习资源、技术文章分享

程序新视界-微信公众号

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序新视界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值