【问题标题】:Lambda - if anyMatch do something orElse do somethingLambda - if anyMatch 做某事或Else 做某事
【发布时间】:2019-05-18 22:23:00
【问题描述】:

我可以使用一个 lambda 表达式来完成所有逻辑吗?

boolean isTrue = myList.stream().anyMatch(m -> m.getName().equals("a");         

if(isTrue) { do something } 
else { do something }

【问题讨论】:

  • 您提供的代码甚至无法编译。除此之外,您还不清楚您要达到的目标。
  • 我想知道anyMatch之后可以继续lamda表达式吗?像 list.stream(),anyMatch(true).do(dosomething).orElse(dosomething);
  • anyMatch() 返回一个原始的boolean,所以你显然不能继续 lambda 表达式。
  • 您可以使用filter(e -> /*condition*/).findAny().ifPresent(e -> /*consumer*/) 作弊。但是,没有orElse
  • 在返回booleanStream.anyMatch() 要求)之前,lambda 几乎可以做任何你想做的事情——基于每个元素——。 anyMatch() 本身的最终结果必然超出作为其参数传递的 lambda 的范围。

标签: java lambda java-8


【解决方案1】:

从 Java 9 开始添加 Optional

public void ifPresentOrElse​(Consumer<? super T> action, Runnable emptyAction)

也可以使用返回Optionalfilter(..).findAny() 而不是返回booleananyMatch(..)

所以你可以编写类似的代码

yourStream
    .filter(..)
    .findAny() //returns Optional
    .ifPresentOrElse(
        // action when value exists 
        value -> System.out.println("There was a value "+value),
        // action when there is no value
        () -> System.out.println("No value found")
    );

【讨论】:

  • 我不明白这与anyMatch 有什么关系,boolean 返回一个boolean。此外,无论如何,它不会比简单的if(myList.stream().anyMatch(m -> m.getName().equals("a"))) { do something } else { do something other } 有所改进。
  • @Holger 我试图澄清一下我的答案。无论如何,因为正如您提到的anyMatch 返回布尔值,我怀疑它仅用作示例,而 main 问题/意图更多的是“如何用流/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) 结尾也是合理的。
  • 嗯,是的,如果需要该值,.findAny().ifPresentOrElse(…) 是一个合理的选择。但这样一来,这个问题的例子就选得不好。
猜你喜欢
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
  • 2015-05-31
  • 2021-05-29
  • 2016-08-23
相关资源
最近更新 更多