在执行过滤器findFirst时获取NoSuchElementException

时间:2019-04-04 15:52:56

标签: filter java-8 nosuchelementexception findfirst

当执行过滤器findFirst时,我一直在获取'java.util.NoSuchElementException:No value present'。 我不能更改太多代码,因为它将破坏代码的其他部分,并且我们不想在过滤器内编写方法逻辑。 代码给出如下。

---调用方法时出现错误

错误:

java.util.NoSuchElementException: No value present
        at java.util.Optional.get(Optional.java:135)

错误是因为“ .filter(x-> x> 5)的值为空                     .findFirst()”

public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 10, 3, 7, 5);
        int a = list.stream()
                   // .peek(num -> System.out.println("will filter " + num))
                .filter(x -> x== null)
                .map( t -> {
                    System.out.println("hello");
                    return 0;
                })
                    .filter(x -> x > 5)
                    .findFirst()
                    .get();
        System.out.println(a);

在这里list.stream()将给出将由.filter(x-> x == null)使用的流。 现在,在这种情况下x不为null,因此当涉及.filter(x-> x> 5)时,由于流不存在,它给出了null。 因此是例外。

为此,我需要其他帮助。

1 个答案:

答案 0 :(得分:0)

这将按预期打印10,如果列表为空,则显示“ Null”:

List<Integer> list = Arrays.asList(1, 10, 3, 7, 5);
Optional<Integer> a = list.stream()
        .filter(x -> x > 5)
        .findFirst();
System.out.println(a.isPresent() ? a.get() : "Null");

您不想在这里使用map方法,该方法用于将操作应用于每个元素并将其替换为结果。例如,.map(x -> x + 3)会将[1, 10, 3, 7, 5]更改为[4, 13, 6, 10, 8]。您无法通过map之类的中间操作来判断流是否为空,您需要使用findFirst之类的终端操作并查看结果。