使用 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
为什么下面的代码是 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