我是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();
}
但是我遇到了不兼容的类型错误。
答案 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);