Différence entre Predicate<T>
y Function<T, R>
Avant tout, un Predicate<T>
es strictement une fonction à valeur booléenne :
_ _ _ _ _ _ _
| |
T --> | predicate | --> boolean
|_ _ _ _ _ _ _|
Alors que cela n'est pas nécessairement vrai pour un Function<T, R>
:
_ _ _ _ _ _ _
| |
T --> | function | --> R
|_ _ _ _ _ _ _|
Ce dernier consomme n'importe quel type d'objet tout comme Predicate<T>
permet mais peut varier dans le type de retour.
Cas d'utilisation de Predicate<T>
y Function<T, R>
Le cas d'utilisation de Predicate<T>
c'est lorsque vous avez besoin d'une fonction qui consomme un argument de type T
et renvoie un booléen. Par exemple, cela peut être dans une situation où vous voulez filtrer un flux d'éléments, trouver le premier élément d'un flux qui satisfait à une condition comme telle de .filter(predicate).findFirst()
ou la vérification de la présence d'un élément d'un flux qui satisfait à une certaine condition comme tel de anyMatch
, noneMatch
, allMatch
etc.
Le cas d'utilisation de Function<T, R>
c'est lorsque vous avez besoin d'une fonction qui consomme un argument de type T
et le transforme en un type R
Par exemple, cela peut être lors de l'appel stream.map(func)
.
Explication de votre extrait de code :
En ce qui concerne l'extrait d'exemple dans votre post Predicate<String>
y Function<String, Boolean>
sont la même chose en termes de ce qu'ils représentent, c'est-à-dire qu'ils représentent tous les deux une fonction prenant a String
et renvoyer un boolean
. Cependant, la première évite de mettre en boîte la valeur renvoyée par la fonction boolean
a Boolean
alors que la seconde ne le fait pas.
Cela dit, cela ne signifie pas nécessairement que partout où l'on peut utiliser une Predicate<String>
vous pouvez également utiliser un Function<String, Boolean>
ou vice versa.
Exemple :
Pendant que ça se compile :
Predicate<String> predicate = p -> p.length() == 21;
Stream<String> stream = stringList().stream().filter(predicate);
Ce n'est pas le cas :
Function<String, Boolean> function = p -> p.length() == 21;
Stream<String> stream = stringList().stream().filter(function);
et vice versa :
Pendant que ça marche :
Function<String, Boolean> function = p -> p.length() == 21;
Stream<Boolean> stream = stringList().stream().map(function);
Ce n'est pas le cas :
Predicate<String> predicate = p -> p.length() == 21;
Stream<Boolean> stream = stringList().stream().map(predicate);
4 votes
A
Predicate
est juste unFunction
qui renvoieBoolean
. En d'autres termesPredicate<T>
est unFunction<T, Boolean>
. MaisPredicate
renvoie unboolean
il n'y a donc pas de relation d'héritage.4 votes
@BoristheSpider nitpick, c'est
boolean
noBoolean
0 votes
@Eugene, je mets juste les choses au point.
6 votes
C'est une différence fondamentale. A
Predicate
peut être évaluée àtrue
ofalse
et rien d'autre. AFunction<…,Boolean>
peut revenirBoolean.TRUE
,Boolean.FALSE
, un autreBoolean
instance représentant soittrue
ofalse
onull
.