使用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("");