使用Java谓词和Lambda
为什么下面的代码返回Predicate<String>
而不是boolean
我的理解是这里的!s.isEmpty()
检查与谓词boolean test(T t);
相反,这里的返回类型是boolean
那么在我的lambda中,我的nonEmptyStringPredicate
应该不是boolean
类型吗?显然不是,我只是想弄明白为什么不是
Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
# 1 楼答案
在本例中,
Predicate
获取String
作为参数,并返回boolean
。 如果我们不把它写成lambda,它会是这样的:# 2 楼答案
这是因为函数
(String s) -> !s.isEmpty()
的类型是一个Predicate<String>
,此时您只需定义一个函数(即“给定一个字符串作为输入,返回一个布尔值,指示它是否为空)请注意,此时您没有计算任何值,因此结果不是布尔值,而是一个函数
文件中对金融机构的定义:
为了得到你正在寻找的“布尔结果”,你必须首先调用“函数方法”。例如:
# 3 楼答案
如果你真的想从} 方法:
Predicate
得到一个布尔值,你可以使用它的^{另一方面^{} 只是一个^{} ,你用一个lambda表达式来表示
# 4 楼答案
谓词总是返回一个布尔值,所以这里唯一有趣的值是输入参数,它是一个字符串
见:https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html
# 5 楼答案
Lambda就像一个匿名类,所以:
就像:
# 6 楼答案
它返回一个谓词,因为在左侧,您将谓词声明为返回类型,在右侧,您将返回谓词的
test()
方法的实现。 当您的代码返回一个作为函数接口实现的对象时(就像在您的例子中),您只需返回其单个抽象方法的逻辑,在本例中为test()
所以基本上就是说,如果你退回这个:Predicate<String> nonEmptyStringPredicate = new Predicate { @Override boolean test(String input) { return input.isEmpty() } }
当你在编写代码时,编译器“知道”!s.isEmpty()
是方法test
的逻辑,它基本上告诉你“嘿,给我逻辑,我不需要样板代码” 顺便说一句,使用方法引用是一个很好的实践,你可以用!String::isEmpty
替换!s.isEmpty()