当前位置: 首页 > 知识库问答 >
问题:

Java 8 stream findFirst抛出NPE,无法从流中筛选出非Null对象

赵英哲
2023-03-14

我试图访问内部对象,而不会导致空指针异常。我希望避免手动编写if条件null检查,而是使用利用java 8特性。

我从findFirst方法中获得Nullpointer异常。我知道如果所选元素为null,findFirst会返回null指针异常,所以我在调用findFirst之前尝试使用过滤器(objects::nonNull)过滤出null对象,但它仍然会抛出null指针。

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

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;
    }
}

共有1个答案

华项明
2023-03-14

您正在调用可选的

使用

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);
 类似资料:
  • 默认情况下,MapStruct将NullValueMappingStrategy作为RETURN_NULL。我的要求是,当source为null时,我需要抛出一个NPE,类似于lombok的@nonnull的工作方式。

  • 问题内容: 考虑以下之一: 在这里,Sysout必须使用String。因此,必须在实例上调用toString()。 那么为什么null.toString()很棒呢?Sysout会照顾这个吗? 编辑:其实我用StringBuilder的append()看到了这怪异的东西。因此尝试了Sysout。两者的行为方式相同。那该方法也要注意吗? 问题答案: 的调用(即编写时调用的方法),如Javadoc中所述

  • Java8引入了可选的方法来处理NPE。在实际应用中,我不能理解一个问题。 我有方法A 但是如果para=null,它将抛出NPE。 方法B 如果我检查para不为null,A和B之间的区别是什么。 “可选”的含义在哪里。

  • 我正在使用ModelMapper进行NPE 目录服务测试 目录服务 目录映射器 目录库 按预期返回CatalogEntity对象,问题出现在执行返回null之后。

  • 我正在调试一个HiveProcessor,它遵循官方的PutHiveStreaming处理器,但它写入的是Hive2.x,而不是3.x。该流在Nifi cluster 1.7.1中运行。尽管发生此异常,但数据仍被写入配置单元。 例外情况是: 有人做过类似的事吗?或者有没有更简单的方法来调试自定义处理器?