[英]Using Java Predicate and Lambda
为什么下面的代码返回Predicate<String>
而不是boolean
?
我的理解是这里的!s.isEmpty()
检查与 Predicate boolean test(T t);
这里的返回类型是boolean
。
所以在我的 lambda 中,我的nonEmptyStringPredicate
不应该是boolean
类型吗? 显然,它不是,我只是想了解为什么不是。
Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
在这种情况下, Predicate
获取String
作为参数并返回boolean
。 如果我们不把它写成 lambda,它看起来像这样:
Predicate<String> somePredicate = new Predicate<String>() {
@Override
public boolean test(String string) {
return !string.isEmpty();
}
};
如果你真的愿意从Predicate
得到一个布尔值,你可以使用它的test
方法:
Predicate<String> nonEmptyStringPredicate = s -> !s.isEmpty();
boolean val = nonEmptyStringPredicate.test("any"); // true
另一方面, Predicate
只是一个FunctionalInterface
,您使用 lambda 表达式表示。
Lambda 就像一个匿名类,所以这个:
Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
就好像:
Predicate<String> nonEmptyStringPredicate = new Predicate<String>() {
public boolean test(String s) {
return !s.isEmpty();
}
}
为什么下面的代码返回 Predicate 而不是布尔值?
这是因为函数的类型(String s) -> !s.isEmpty()
是Predicate<String>
,此时您只是定义了一个函数(它说“给定一个字符串作为输入返回一个布尔值指示它是否为空)。
请注意,此时您没有评估任何内容,因此结果不是 boolean 而是function 。
文档中 FI 的定义:
函数式接口为 lambda 表达式和方法引用提供目标类型。 每个函数式接口都有一个抽象方法,称为该函数式接口的函数式方法,lambda 表达式的参数和返回类型与之匹配或适应。 函数式接口可以在多个上下文中提供目标类型,例如赋值上下文、方法调用或强制转换上下文:
为了获得您正在寻求的“布尔结果”,您必须首先调用“功能方法”。 例子:
Predicate<String> nonEmptyStringPredicate = s -> !s.isEmpty();
boolean result = nonEmptyStringPredicate.test("");
谓词总是返回一个布尔值,所以这里唯一有趣的值是输入参数,它是一个字符串。
请参阅: https : //docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html
它返回一个谓词,因为在左侧,您将谓词声明为返回类型,而在右侧,您将返回 Predicate 的test()
方法的实现。 当您的代码返回一个作为功能接口实现的对象时(如您的情况),您只需返回其单个抽象方法的逻辑,在本例中为test()
所以基本上就像您正在返回: Predicate<String> nonEmptyStringPredicate = new Predicate { @Override boolean test(String input) { return input.isEmpty() } }
当你写代码时,编译器“知道” !s.isEmpty()
是方法test
的逻辑,它基本上告诉你“嘿给我逻辑,我不需要样板代码”顺便说一句是使用方法引用的好习惯,你可以用!String::isEmpty
替换!s.isEmpty()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.