【问题标题】:Getting first element and returning after apply a function获取第一个元素并在应用函数后返回
【发布时间】:2019-11-19 18:18:14
【问题描述】:

我是 Java 8 的新手,我想创建一个方法来获取第一个匹配的元素并在应用函数后返回

public void test() {
    List<String> features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");

    String str = features
            .stream()
            .filter(s -> "Lambdas".equals(s))
            .findFirst()
            .ifPresent(this::toLowerCase);
}

private String toLowerCase (String str) {
    return str.toLowerCase();
}

但我收到了不兼容类型错误。

【问题讨论】:

  • 不要使用ifPresent。它是无效的。使用map,后跟getorElseorElseGet、...
  • 不错的功能列表 :-)
  • 顺便说一句,我喜欢s -&gt; s.equals("Lambdas")。如果你坚持yoda condition,也可以使用方法参考:"Lambdas"::equals
  • 您是否明确要为此目的使用Stream API?它也可以通过利用features.contains() 方法来实现。如果此条件的计算结果为 true,则只需返回 "Lambdas" 字符串的小写值。

标签: java lambda java-8 functional-programming java-stream


【解决方案1】:

Optional.ifPresent 接受Consumer,并且不返回任何值。使用map:

String str =
    features.stream()
            .filter(s -> "Lambdas".equals(s))
            .findFirst()
            .map(this::toLowerCase)
            .orElse(null); // default value or orElseThrow

或者,按照 Holger 的建议,您可以将 map 步骤移到流管道中:

String str =
    features.stream()
            .filter(s -> "Lambdas".equals(s))
            .map(this::toLowerCase)
            .findFirst()
            .orElse(null); // default value or orElseThrow

【讨论】:

  • ...并在流链中使用map,即.filter(s -&gt; "Lambdas".equals(s)) .map(this::toLowerCase) .findFirst() … 也可以。
【解决方案2】:
 String str =
        features
            .stream()
            .filter("Lambdas"::equals)
            .findFirst()
            .map(this::toLowerCase)
            .orElse("AnythingElse");

findFirst 返回一个Optional,因此在该Optional 上使用一些方法,例如orElse,它将返回 一些字符串实例。

仔细查看 Optional::ifPresent 将什么作为输入 - 它是 Consumer,因此将其读作“以该字符串作为输入,对其执行某些操作并且不返回任何内容”。

【讨论】:

    【解决方案3】:

    如果找到orElse,您可以将字符串映射到null

    List<String> features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
    String str = features
            .stream()
            .filter(s -> "Lambdas".equals(s))
            .findFirst()
            .map(String::toLowerCase)
            .orElse(null);
    

    【讨论】:

      猜你喜欢
      • 2015-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 2011-05-16
      • 1970-01-01
      • 2016-10-31
      • 2021-03-07
      • 2018-05-01
      相关资源
      最近更新 更多