为什么下面的代码返回Predicate<String>
而不返回boolean
?
我的理解是,这里的!s.isEmpty()
检查与谓词boolean test(T t);
背道而驰。这里的返回类型为boolean
。
因此,在我的lambda中,我的nonEmptyStringPredicate
不应为boolean
类型吗?显然不是,我只是想了解为什么不是。
Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
答案 0 :(得分:6)
在这种情况下,Predicate
得到一个String
作为参数,并返回一个boolean
。
如果我们不将其写为lambda,它将看起来像这样:
Predicate<String> somePredicate = new Predicate<String>() {
@Override
public boolean test(String string) {
return !string.isEmpty();
}
};
答案 1 :(得分:3)
如果您确实愿意从Predicate
获取布尔值,则可以使用其test
方法:
Predicate<String> nonEmptyStringPredicate = s -> !s.isEmpty();
boolean val = nonEmptyStringPredicate.test("any"); // true
另一方面, Predicate
只是一个FunctionalInterface
,是您使用lambda表达式表示的。
答案 2 :(得分:1)
Lambda是Java只是一个匿名类。这个:
Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
与此相同:
Predicate<String> nonEmptyStringPredicate = new Predicate<String>() {
public boolean test(String s) {
return !s.isEmpty();
}
}
答案 3 :(得分:1)
为什么下面的代码返回谓词而不是布尔值?
这是因为功能 (String s) -> !s.isEmpty()
的类型为Predicate<String>
,此时,您只需定义一个功能(说“给定一个String作为输入,则返回一个布尔值指示它是否为空)。
请注意,此时您尚未评估任何内容,因此结果不是布尔值而是函数。
文档中FI的定义:
功能接口为lambda表达式和 方法参考。每个功能接口都有一个摘要 方法,称为该功能接口的功能方法 匹配lambda表达式的参数和返回类型 或改编。功能接口可以在其中提供目标类型 多个上下文,例如赋值上下文,方法调用或 投射上下文:
为了获得您要查找的“布尔结果”,必须首先调用“函数方法”。例如:
Predicate<String> nonEmptyStringPredicate = s -> !s.isEmpty();
boolean result = nonEmptyStringPredicate.test("");
答案 4 :(得分:0)
谓词总是返回一个布尔值,因此这里唯一有趣的值是输入参数,它是一个字符串。
请参阅:https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html