【问题标题】:Getting NoSuchElementException when doing filter findFirst执行过滤器 findFirst 时出现 NoSuchElementException
【发布时间】:2019-04-04 15:52:56
【问题描述】:

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

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

【问题讨论】:

  • .findFirst() 返回的Optional 可以为空。这意味着,没有找到匹配项。当source.getTrans() 返回一个空集合或null(当您将null 显式映射到一个空集时),或者filter 谓词不接受任何内容时,可能会发生这种情况。请注意,您的流仅接受 .getDType() == null .getD() != null 的元素。通常,您不应在未检查值是否存在的情况下对 Optional 调用 get()。如果是这样,您的后续测试(除了混淆 trans 变量和 EmployeeTransaction 类型)是多余的
  • 是的,但在这种情况下 source.getTrans() 有值
  • 你有一个类一个变量都叫EmployeeTransaction吗?
  • 你可以用这个例子,
  • 您是否要求替代 get() 调用,因为它会引发异常?为什么不orElse(...)

标签: filter java-8 nosuchelementexception findfirst


【解决方案1】:

这将按预期打印 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 -&gt; x + 3) 会将[1, 10, 3, 7, 5] 更改为[4, 13, 6, 10, 8]。通过map这样的中间操作无法判断流是否为空,需要使用findFirst这样的终端操作并查看结果。

【讨论】:

  • 谢谢,但如果列表为空,则会中断。
  • @Rahul 我添加了一些可能的方法来处理空列表。
  • 谢谢,但我必须在下面调用以防 NULL.. map( t -> { System.out.println("Null"); return 0;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 2022-01-17
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
相关资源
最近更新 更多