Lambda - 如果任何元素匹配则执行某些操作,否则执行其他操作

4

我能用一个lambda表达式完成所有逻辑吗?

boolean isTrue = myList.stream().anyMatch( m -> m.getName().equals("a") );         
         
if (isTrue) { do something } 
else { do other thing }

1
您提供的代码甚至无法编译。此外,您试图实现什么并不十分清楚。 - Samuel Philipp
我想学习如何在anyMatch之后继续使用lambda表达式。就像list.stream(),anyMatch(true).do(dosomething).orElse(dosomething); - Bilgin Silahtaroğlu
anyMatch() 返回一个原始的 boolean,因此您显然无法继续使用 lambda 表达式。 - Samuel Philipp
Lambda 函数可以在返回 boolean 值(如 Stream.anyMatch() 所需)之前,按元素执行几乎任何你想要的操作。anyMatch() 的最终结果必然超出作为其参数传递的 lambda 函数的范围。 - John Bollinger
filter(e -> /condition/).findAny().ifPresent(e -> /consumer/) 如果不存在呢? - Bilgin Silahtaroğlu
显示剩余2条评论
1个回答

11
自Java 9起,添加了Optional类。 public void ifPresentOrElse​(Consumer<? super T> action, Runnable emptyAction) 而且,你可以使用filter(<<yourCondition>>).findAny()代替返回布尔值的anyMatch(<<yourCondition>>)。filter()方法返回了Optional类型。 因此,你可以结合它们并编写像下面这样的代码。
yourStream
    .filter(m -> m.getName().equals("a")) //your condition
    .findAny() //returns Optional
    .ifPresentOrElse(
        // action when value exists 
        value -> System.out.println("There was a value "+value),

        // action when there was no value
        () -> System.out.println("No value found")
    );

我不明白这与anyMatch有什么关系,因为它返回一个布尔值。此外,这也不会比一个简单的if(myList.stream().anyMatch(m -> m.getName().equals("a"))) { do something } else { do something other }更好。 - Holger
1
@Holger 我尝试澄清我的回答。无论如何,由于你提到anyMatch返回布尔值,我怀疑它只是作为一个例子使用,主要问题/意图更多地是“如何用流/lambda表达if(valueInStream){ handleValue } else { doSomethingElse }?”我不反对if(myList.stream().anyMatch(m -> m.getName().equals("a"))) { do something } else { do something other }更简单,但在流更复杂的情况下,以.ifPresentOrElse(MyClass::handleValue, MyClass::handleLackOfValue)结束也是合理的。 - Pshemo
嗯,如果需要该值,则使用.findAny().ifPresentOrElse(...)是一个合理的选择。但是,问题的示例选择可能不佳。 - Holger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接