La raison pour laquelle vous avez du mal à saisir la signification d'interfaces fonctionnelles telles que celles de java.util.function
est que les interfaces définies ici n'ont aucune signification! Ils sont présents principalement pour représenter la structure , pas la sémantique .
Ceci est atypique pour la plupart des API Java. L'API Java typique, telle qu'une classe ou une interface, a une signification, et vous pouvez développer un modèle mental pour ce qu'elle représente et l'utiliser pour comprendre les opérations sur elle. Considérez java.util.List
par exemple. A List
est un conteneur d'autres objets. Ils ont une séquence et un index. Le nombre d'objets contenus dans la liste est renvoyé par size()
. Chaque objet a un index dans la plage 0..size-1 (inclus). L'objet à l'index i peut être récupéré en appelant list.get(i)
. Et ainsi de suite.
Les interfaces fonctionnelles dans java.util.function
n'ont pas une telle signification. Au lieu de cela, ce sont des interfaces qui représentent simplement la structure d'une fonction, comme le nombre d'arguments, le nombre de valeurs de retour et (parfois) si un argument ou une valeur de retour est une primitive. Nous avons donc quelque chose comme ce Function<T,R>
qui représente une fonction qui prend un seul argument de type T et renvoie une valeur de type R . C'est tout. Que fait cette fonction? Eh bien, il peut tout faire ... du moment qu'il prend un seul argument et renvoie une seule valeur. C'est pourquoi la spécification pour Function<T,R>
est un peu plus que «Représente une fonction qui accepte un argument et produit un résultat».
De toute évidence, lorsque nous écrivons du code, il a un sens, et ce sens doit venir de quelque part. Dans le cas des interfaces fonctionnelles, la signification vient du contexte dans lequel elles sont utilisées. L'interface Function<T,R>
n'a aucune signification isolée. Cependant, dans l' java.util.Map<K,V>
API, il y a ce qui suit:
V computeIfAbsent(K key, Function<K,V> mappingFunction)
(les jokers élidés par souci de brièveté)
Ah, cette utilisation de Function
est une "fonction de cartographie". Qu'est-ce que cela fait? Dans ce contexte, si key
n'est pas déjà présente dans la carte, la fonction de mappage est appelée et reçoit la clé et devrait produire une valeur, et la paire clé-valeur résultante est insérée dans la carte.
Vous ne pouvez donc pas regarder la spécification pour Function
(ou l'une des autres interfaces fonctionnelles, d'ailleurs) et essayer de discerner ce qu'elles signifient. Vous devez regarder où elles sont utilisées dans d'autres API pour comprendre ce qu'elles signifient, et cette signification ne s'applique qu'à ce contexte.
Consumer
etSupplier
vous pouvez également rechercher le tutoriel pourConsumer
…