java8streamfindfirst_Java 8 stream findFirst throwing NPE,无法过滤掉流中的非空对象

本文探讨了在使用Java8 Streams API时遇到的问题,特别是在尝试通过过滤非空对象来避免空指针异常的过程中出现的问题。作者提供了一个示例代码片段,展示了如何在调用findFirst方法前使用过滤器去除流中的空对象,但仍然遇到了空指针异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我试图访问内部对象而不引起空指针异常。 如果条件null检查并使用利用java 8功能,我想避免手动编写。Java 8 stream findFirst throwing NPE,无法过滤掉流中的非空对象

我正在从findFirst方法获取Nullpointer异常。我知道,findFirst返回空指针异常,如果选定的元素为空,所以我试图在调用findFirst之前使用过滤器(对象:: nonNull)过滤掉空对象,但它仍然抛出空指针。

看起来像我的过滤不起作用,但我不知道为什么。

Please find below the code

package main.java;

import java.util.*;

import java.util.stream.Stream;

public class OptionalTest {

public static void main(String args[]) {

Inner in = new Inner("Has Value");

Nested nest = new Nested(in);

List list = new ArrayList();

//list.add(nest); //commented out to test failure scenario

list.add(null); //added null

list.add(null); //added null

Outer outer = new Outer(list);

OuterMost outermost = new OuterMost(outer);

Optional innerValue = Optional.ofNullable(outermost) // outermost var can be null, hence using Optional.ofNullable

.map(OuterMost::getOuter)

.map(Outer::getNested)

.map(Collection::stream)

.filter(Objects::nonNull) //findFirst throws null pointer if selected element is null, hence filtering out null

.flatMap(Stream::findFirst)

.map(Nested::getInner)

.map(Inner::getFoo);

System.out.println(innerValue.orElse("No Value"));

}

}

//Classes OuterMost>Outer>Nested(List)>Inner

class OuterMost {

public OuterMost(Outer out) {

outer = out;

}

Outer outer;

Outer getOuter() {

return outer;

}

}

class Outer {

public Outer(List nest) {

nested = nest;

}

List nested;

List getNested() {

return nested;

}

}

class Nested {

public Nested(Inner in) {

inner = in;

}

Inner inner;

Inner getInner() {

return inner;

}

}

class Inner {

public Inner(String val) {

foo = val;

}

String foo;

String getFoo() {

return foo;

}

}

2016-12-04

phx

+0

你需要收集结果 –

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值