执行过滤器findFirst时,我继续得到'java.util.NoSuchElementException:没有值'。我无法更改代码,因为它会破坏代码的其他部分,我们不想在filter中编写方法逻辑。代码给出如下。
---调用方法时,我收到以下错误
错误:
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不是null,所以当它来到.filter(x - > x> 5)时它会给出null,因为stream不在那里。因此例外。
我需要一些替代方案的帮助。
这将按预期打印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
这样的终端操作并查看结果。