问题
Why does the below code return Predicate<String> and not boolean?
My understanding is that the !s.isEmpty() check here is going against the Predicate boolean test(T t); The return type here is boolean.
So in my lambda should my nonEmptyStringPredicate not be of type boolean? Obviously, it's not, I'm just trying to understand why it's not.
Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
回答1:
A Predicate gets in this case a String as parameter and returns a boolean.
In case we don't write it as lambda it would look like this:
Predicate<String> somePredicate = new Predicate<String>() {
@Override
public boolean test(String string) {
return !string.isEmpty();
}
};
回答2:
If you really are willing to get a boolean though from the Predicate, you can use its test method:
Predicate<String> nonEmptyStringPredicate = s -> !s.isEmpty();
boolean val = nonEmptyStringPredicate.test("any"); // true
Predicate on the other hand is just a FunctionalInterface, that you've represented using a lambda expression.
回答3:
Lambda is like an anonymous class, so this:
Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
Is like:
Predicate<String> nonEmptyStringPredicate = new Predicate<String>() {
public boolean test(String s) {
return !s.isEmpty();
}
}
回答4:
Why does the below code return Predicate and not boolean?
This is because the type of the function (String s) -> !s.isEmpty() is a Predicate<String>, at this point you're simply defining a function (which says "given a String as input return a boolean value indication whether it's empty or not).
Note that at this point you're not evaluating anything hence the result is not a boolean but rather a function.
Definition of FI from the doc:
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:
in order to get the "boolean result" you're seeking, you must first invoke the "functional method". example:
Predicate<String> nonEmptyStringPredicate = s -> !s.isEmpty();
boolean result = nonEmptyStringPredicate.test("");
回答5:
A predicate always returns a boolean so the only interesting value here is the input parameter which is a String.
See: https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html
来源:https://stackoverflow.com/questions/53633089/using-java-predicate-and-lambda