web-dev-qa-db-fra.com

Utiliser Java Predicate et Lambda

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();
8
Taobitz

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();
    }
};
6
CodeMatrix

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.

3
nullpointer

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();
    }
}
1
M314

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(""); 
1
Aomine

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

0
comrad