Java 8流findfirst投掷NPE,无法从流中过滤出非null对象



我试图访问内部对象而不会引起零指针异常。我想避免手动编写条件无效检查并使用使用Java 8功能。

我从Findfirst方法中获得了NullPointer异常。我知道FindFirst返回null指针异常如果选择的元素为null,因此我尝试在调用FindFirst之前使用过滤器(Objects :: Nonull)过滤null对象,但是它仍在抛出Null Pointer。

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

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<Nested> list = new ArrayList<Nested>();
        //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<String> 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<Nested> nest) {
        nested = nest;
    }
    List<Nested> nested;
    List<Nested> 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;
    }
}

您在Optional<Stream<Nested>>上调用过滤器(),而不是在Stream<Nested>上调用。

使用

Optional<String> innerValue = Optional.ofNullable(outermost) // outermost var can be null, hence using Optional.ofNullable
            .map(OuterMost::getOuter)
            .map(Outer::getNested)
            .map(nestedList -> nestedList.stream().filter(Objects::nonNull))
            .flatMap(Stream::findFirst)
            .map(Nested::getInner)
            .map(Inner::getFoo);

最新更新