【发布时间】: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