使用Java谓词和Lambda
为什么下面的代码返回的是使用Java谓词和Lambda,java,lambda,java-8,predicate,functional-interface,Java,Lambda,Java 8,Predicate,Functional Interface,为什么下面的代码返回的是谓词,而不是布尔值 我的理解是,!s、 isEmpty()检查此处是否与谓词布尔测试(T)相反此处的返回类型为布尔值 因此,在我的lambda中,我的非空字符串谓词应该不是布尔类型?显然不是,我只是想弄明白为什么不是 Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty(); 谓词非空字符串谓词=(字符串s)->!s、 isEmpty(); 谓词总是返回布尔值,因此这里
谓词
,而不是布尔值
我的理解是,!s、 isEmpty()
检查此处是否与谓词布尔测试(T)相反代码>此处的返回类型为布尔值
因此,在我的lambda中,我的非空字符串谓词
应该不是布尔类型
?显然不是,我只是想弄明白为什么不是
Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
谓词非空字符串谓词=(字符串s)->!s、 isEmpty();
谓词总是返回布尔值,因此这里唯一有趣的值是输入参数,它是一个字符串
请参阅:如果您确实愿意从谓词中获取布尔值,则可以使用其方法:
谓词nonEmptyStringPredicate=s->!s、 isEmpty();
布尔val=nonEmptyStringPredicate.test(“any”);//真的
另一方面,它只是一个,使用lambda表达式表示。a谓词
在本例中获取一个字符串
作为参数,并返回一个布尔值
。
如果我们不把它写成lambda,它会是这样的:
Predicate<String> somePredicate = new Predicate<String>() {
@Override
public boolean test(String string) {
return !string.isEmpty();
}
};
Predicate somePredicate=new Predicate(){
@凌驾
公共布尔测试(字符串){
return!string.isEmpty();
}
};
Lambda就像一个匿名类,因此:
Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
谓词非空字符串谓词=(字符串s)->!s、 isEmpty();
就像:
Predicate<String> nonEmptyStringPredicate = new Predicate<String>() {
public boolean test(String s) {
return !s.isEmpty();
}
}
谓词nonEmptyStringPredicate=新谓词(){
公共布尔测试(字符串s){
return!s.isEmpty();
}
}
为什么下面的代码返回谓词而不是布尔值
这是因为函数的类型是(字符串s)->!s、 isEmpty()
是一个谓词
,此时您只需定义一个函数(表示“给定一个字符串作为输入,返回一个布尔值指示它是否为空)
请注意,此时您没有计算任何值,因此结果不是布尔值,而是一个函数
从文件中定义金融机构:
函数接口为lambda表达式和
方法引用。每个函数接口都有一个摘要
方法,称为该函数接口的函数方法
lambda表达式的参数和返回类型相匹配
功能接口可以在中提供目标类型
多个上下文,如赋值上下文、方法调用或
演员阵容:
为了获得您正在寻找的“布尔结果”,必须首先调用“函数方法”。示例:
Predicate<String> nonEmptyStringPredicate = s -> !s.isEmpty();
boolean result = nonEmptyStringPredicate.test("");
Predicate nonEmptyStringPredicate=s->!s.isEmpty();
布尔结果=nonEmptyStringPredicate.test(“”);
谢谢!-因此,如果我使用谓词,它将始终返回我传入的谓词,在本例中为字符串。不客气。如果您需要有关lambdas check的更多信息。顺便说一句,您不应该忘记接受答案以向其他人显示问题已解决。您似乎混淆了lambdas的功能/返回以及函数的类型Lambdas和AIC是相似的,但并不相同。它们有一些细微的区别(即这意味着什么),并且它们以完全不同的方式实现。你是对的,但我确实认为这是一个很好的方式来形象化Lambdas或向一个人解释如何使用它们。
Predicate<String> nonEmptyStringPredicate = s -> !s.isEmpty();
boolean result = nonEmptyStringPredicate.test("");