应用功能后获取第一个元素并返回

时间:2019-07-10 07:15:46

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

我是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();
}

但是我遇到了不兼容的类型错误。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

 String str =
        features
            .stream()
            .filter("Lambdas"::equals)
            .findFirst()
            .map(this::toLowerCase)
            .orElse("AnythingElse");

findFirst返回一个Optional,因此在该Optional上使用某种方法,例如orElse返回一些String实例。

仔细查看Optional::ifPresent作为输入的内容-它是Consumer,因此将其读为“将String作为输入,对其进行处理,但不返回任何内容”。

答案 2 :(得分:2)

如果找到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);