【问题标题】:Else method for ifPresent Stream [duplicate]ifPresent Stream的其他方法[重复]
【发布时间】:2015-09-21 21:04:27
【问题描述】:

如果在过滤流后某些值不存在,我想知道如何做一些行为。

假设代码:

foo.stream().filter(p -> p.someField == someValue).findFirst().ifPresent(p -> {p.someField = anotherValue; someBoolean = true;}); 

如果值不存在,我如何在ifPresent 之后放置某种Else

我可以在 findFirst 之后调用 Stream 上的一些 orElse 方法,但我看不到使用这些 orElse 的方法

【问题讨论】:

  • @TagirValeev 谢谢,看来在 jdk9 中将是一个特定的方法来做到这一点

标签: java lambda java-8 java-stream optional


【解决方案1】:

findFirst 返回描述此流的第一个元素的 Optional,如果流为空,则返回一个空的 Optional。

如果您想在Optional 不为空时应用函数,您应该使用map。如果Optional 为空,orElseGet 可以调用另一个 lambda,例如

foo.stream()
   .filter(p -> p.someField == someValue)
   .findFirst().map(p -> {
       p.someField = anotherValue;
       someBoolean = true;
       return p;
   }).orElseGet(() -> {
       P p = new P();
       p.someField = evenAnotherValue;
       someBoolean = false;
       return p;
   });

【讨论】:

  • 好的,但是如果我想执行orElse中的指令?例如,我想执行p.someField = evenAnotherValue; someBoolean = false; 我怎么能用你的方法做到这一点?
  • 这个想法是,如果 Optional 是空的,你就不能用它做任何事情。 orElse 旨在创建任何类型 p 的新对象,您可以在其上调用 map 。我会更新答案
  • 很好,它按预期工作。
猜你喜欢
  • 1970-01-01
  • 2015-12-17
  • 2015-02-19
  • 2020-12-03
  • 2016-08-07
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
相关资源
最近更新 更多