使用 Java 谓词和 Lambda

Using Java Predicate and Lambda

为什么下面的代码是 return Predicate<String> 而不是 boolean

我的理解是这里的!s.isEmpty()检查是违背谓词boolean test(T t);这里的return类型是boolean

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

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

谓词总是 returns 布尔值,所以这里唯一有趣的值是输入参数,它是一个字符串。

参见:https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html

如果你真的愿意从 Predicate 得到一个布尔值,你可以使用它的 test 方法:

Predicate<String> nonEmptyStringPredicate = s -> !s.isEmpty();
boolean val = nonEmptyStringPredicate.test("any"); // true

Predicate on the other hand is just a FunctionalInterface,您已使用 lambda 表达式表示。

在这种情况下,

A Predicate 得到一个 String 作为参数,returns 得到一个 boolean。 如果我们不把它写成 lambda,它看起来像这样:

Predicate<String> somePredicate = new Predicate<String>() {
    @Override
    public boolean test(String string) {
        return !string.isEmpty();
    }
};

Lambda 就像一个匿名的 class,所以:

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

就像:

Predicate<String> nonEmptyStringPredicate = new Predicate<String>() {
    public boolean test(String s) {
        return !s.isEmpty();
    }
}

Why does the below code return Predicate and not boolean?

这是因为函数(String s) -> !s.isEmpty()的类型是Predicate<String>,此时你只需定义a function(表示“给定一个字符串作为输入 return 一个布尔值指示它是否为空)。

请注意,此时您没有评估任何东西,因此结果不是布尔值而是 函数

文档中 FI 的定义:

Functional interfaces provide target types for lambda expressions and method references. Each functional interface has a single abstract method, called the functional method for that functional interface, to which the lambda expression's parameter and return types are matched or adapted. Functional interfaces can provide a target type in multiple contexts, such as assignment context, method invocation, or cast context:

为了获得您正在寻找的 "boolean result",您必须首先调用 "functional method"。示例:

Predicate<String> nonEmptyStringPredicate = s -> !s.isEmpty();
boolean result = nonEmptyStringPredicate.test(""); 

它 return 是一个谓词,因为在左侧您将谓词声明为 return 类型,而在右侧您正在 return 执行谓词的 test() 方法。 当您的代码 return 是一个功能接口的实现对象(就像您的情况)时,您只需 return 它的单个抽象方法的逻辑,在这种情况下 test() 所以基本上就好像你在 returning 这个: Predicate<String> nonEmptyStringPredicate = new Predicate { @Override boolean test(String input) { return input.isEmpty() } } 当你写代码时,编译器 'knows' 认为 !s.isEmpty() 是方法 test 的逻辑,它基本上告诉你“嘿给我逻辑,我不需要样板代码” 顺便说一句,使用方法引用是个好习惯,您可以将 !s.isEmpty() 替换为 !String::isEmpty