0

执行过滤器 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()”的值为 null

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 不为空,因此当涉及到 .filter(x -> x > 5) 时,它会给出空值,因为流不存在。因此例外。

为此,我需要一些替代方法的帮助。

4

1 回答 1

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并查看结果。

于 2019-04-04T17:48:41.137 回答