使用Java谓词和Lambda

时间:2018-12-05 13:08:45

标签: java lambda java-8 predicate functional-interface

为什么下面的代码返回Predicate<String>而不返回boolean

我的理解是,这里的!s.isEmpty()检查与谓词boolean test(T t);背道而驰。这里的返回类型为boolean

因此,在我的lambda中,我的nonEmptyStringPredicate不应为boolean类型吗?显然不是,我只是想了解为什么不是。

Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();

5 个答案:

答案 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