Pourquoi le code ci-dessous renvoie-t-il Predicate<String>
et non boolean
?
Si j'ai bien compris, la vérification !s.isEmpty()
ici va à l'encontre de la fonction Predicate boolean test(T t);
. Le type de retour ici est boolean
.
Donc, dans mon lambda, ma nonEmptyStringPredicate
ne devrait-elle pas être de type boolean
? Évidemment, ce n'est pas le cas, j'essaie simplement de comprendre pourquoi.
Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
Une Predicate
obtient dans ce cas une String
en paramètre et retourne une boolean
. Si nous ne l'écrivons pas en tant que lambda, cela ressemblerait à ceci:
Predicate<String> somePredicate = new Predicate<String>() {
@Override
public boolean test(String string) {
return !string.isEmpty();
}
};
Si vous voulez vraiment obtenir un booléen de la Predicate
, vous pouvez utiliser sa méthode test
:
Predicate<String> nonEmptyStringPredicate = s -> !s.isEmpty();
boolean val = nonEmptyStringPredicate.test("any"); // true
Predicate
D'autre part, c'est un FunctionalInterface
, que vous avez représenté à l'aide d'une expression lambda.
Lambda est Java est juste une classe anonyme. Ce:
Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
Est-ce la même chose que ça:
Predicate<String> nonEmptyStringPredicate = new Predicate<String>() {
public boolean test(String s) {
return !s.isEmpty();
}
}
Pourquoi le code ci-dessous renvoie-t-il Predicate et non pas booléen?
En effet, le type de fonction (String s) -> !s.isEmpty()
est un Predicate<String>
. À ce stade, vous définissez simplement une fonction (qui dit "une chaîne étant donnée en entrée, elle renvoie une valeur booléenne indiquant si elle est vide ou non. )
Notez qu'à ce stade, vous n'évaluez rien, le résultat n'est donc pas un booléen, mais plutôt une fonction .
Définition de FI du doc:
Les interfaces fonctionnelles fournissent des types de cibles pour les expressions lambda et références de méthodes. Chaque interface fonctionnelle a un seul résumé méthode, appelée la méthode fonctionnelle pour cette interface fonctionnelle, à auquel le paramètre de l'expression lambda et les types de retour sont mis en correspondance ou adapté. Les interfaces fonctionnelles peuvent fournir un type de cible dans plusieurs contextes, tels que le contexte d'affectation, l'invocation de méthode ou contexte de la distribution:
pour obtenir le "résultat booléen" recherché, vous devez d'abord appeler la "méthode fonctionnelle". Exemple:
Predicate<String> nonEmptyStringPredicate = s -> !s.isEmpty();
boolean result = nonEmptyStringPredicate.test("");
Un prédicat renvoie toujours un booléen, la seule valeur intéressante ici est le paramètre d'entrée qui est une chaîne.
Voir: https://docs.Oracle.com/javase/8/docs/api/Java/util/function/Predicate.html