En tant que programmeur non-Java apprenant Java, je lis actuellement sur les interfaces Supplier
et les Consumer
interfaces. Et je ne peux pas comprendre leur utilisation et leur signification. Quand et pourquoi utiliseriez-vous ces interfaces? Quelqu'un peut-il me donner un simple exemple profane de ceci… Je trouve que les exemples de Doc ne sont pas assez succincts pour ma compréhension.
101
Consumer
etSupplier
vous pouvez également rechercher le tutoriel pourConsumer
…Réponses:
C'est le fournisseur:
C'est le consommateur:
Donc, en termes simples, un fournisseur est une méthode qui renvoie une valeur (comme dans sa valeur de retour). Tandis que, un consommateur est une méthode qui consomme une certaine valeur (comme dans l'argument méthode), et effectue certaines opérations sur eux.
Ceux-ci se transformeront en quelque chose comme ceci:
En ce qui concerne l'utilisation, l'exemple très basique serait:
Stream#forEach(Consumer)
method. Il faut un consommateur, qui consomme l'élément du flux sur lequel vous effectuez une itération, et effectue une action sur chacun d'eux. Imprimez-les probablement.la source
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. AList
est un conteneur d'autres objets. Ils ont une séquence et un index. Le nombre d'objets contenus dans la liste est renvoyé parsize()
. Chaque objet a un index dans la plage 0..size-1 (inclus). L'objet à l'index i peut être récupéré en appelantlist.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 ceFunction<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 pourFunction<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:(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, sikey
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.la source
A
Supplier
est toute méthode qui ne prend aucun argument et renvoie une valeur. Son travail est littéralement de fournir une instance d'une classe attendue. Par exemple, chaque référence à une méthode «getter» est unSupplier
Sa référence de méthode d'instance
myClass::getCount
est une instance deSupplier<Integer>
.A
Consumer
est toute méthode qui prend des arguments et ne renvoie rien. Il est invoqué pour ses effets secondaires. En termes Java, aConsumer
est un idiome pour unevoid
méthode. Les méthodes 'setter' sont un bon exemple:Sa référence de méthode d'instance
myClass::setCount
est une instance deConsumer<Integer>
etIntConsumer
.A
Function<A,B>
est toute méthode qui prend un argument d'un type et en renvoie un autre. Cela peut être qualifié de «transformation». LeFunction<A,B>
prend unA
et renvoie unB
. Il convient de noter que pour une valeur donnée deA
, la fonction doit toujours renvoyer une valeur spécifique deB
.A
etB
peut en fait être du même type, comme le suivant:Sa référence de méthode d'instance
myClass:addTwo
est aFunction<Integer, Integer>
et aToIntFunction<Integer>
.Une référence de méthode Class à un getter est un autre exemple de fonction.
Sa référence de méthode de classe
MyClass::getCount
est une instance deFunction<MyClass,Integer>
etToIntFunction<MyClass>
.la source
Pourquoi les consommateurs / fournisseurs / autres interfaces fonctionnelles définies dans le paquet de java.util.function : Consommateur et fournisseur sont deux, parmi d' autres, des interfaces fonctionnelles en construction fournies en Java 8. Le but de toutes ces interfaces fonctionnelles en construction est pour fournir un «modèle» prêt pour les interfaces fonctionnelles ayant des descripteurs de fonction communs (signatures / définitions de méthode fonctionnelle).
Disons que nous avons un besoin pour convertir un type T en un autre type R. Si nous devions passer une fonction définie comme celle-ci en tant que paramètre à une méthode, alors cette méthode aurait besoin de définir une interface fonctionnelle dont la méthode fonctionnelle / abstraite prend le paramètre de type T en entrée et donne un paramètre de type R en sortie. Maintenant, il pourrait y avoir de nombreux scénarios comme celui-ci et le (s) programmeur (s) finiraient par définir plusieurs interfaces fonctionnelles pour leurs besoins. Pour éviter ce genre de scénario, faciliter la programmation et apporter une norme commune dans l'utilisation des interfaces fonctionnelles, un ensemble d'interfaces fonctionnelles intégrées telles que prédicat, fonction, consommateur et fournisseur ont été définis.
Que fait le consommateur : L'interface fonctionnelle du consommateur accepte une entrée, fait quelque chose avec cette entrée et ne donne aucune sortie. Sa définition est comme celle-ci (de Java Source) -
Ici, accept () est la méthode fonctionnelle \ abstraite qui prend une entrée et ne renvoie aucune sortie. Donc, si vous voulez entrer un Integer, faites quelque chose avec sans sortie puis au lieu de définir votre propre interface, utilisez une instance de Consumer.
Que fait le fournisseur : L'interface fonctionnelle du fournisseur ne prend aucune entrée mais renvoie une sortie. Il est défini comme ceci (à partir de Java Source) -
Partout où vous avez besoin d'une fonction qui renvoie quelque chose, disons un entier, mais ne prend aucune sortie, utilisez une instance de Supplier.
Dans le cas où plus de clarté, ainsi que des exemples d'utilisation, des interfaces consommateur et fournisseur sont nécessaires, vous pouvez consulter mes articles de blog sur le même - http://www.javabrahman.com/java-8/java-8-java-util- function-consumer-tutorial-with-examples / et http://www.javabrahman.com/java-8/java-8-java-util-function-supplier-tutorial-with-examples/
la source
1. Signification
Voir mes réponses à ma question ici et à une autre ici , mais en bref, ces nouvelles interfaces fournissent une convention et un caractère descriptif pour que tout le monde puisse les utiliser (+ chaînage de méthodes funky comme
.forEach(someMethod().andThen(otherMethod()))
2. Différences
Consommateur : prend quelque chose, fait quelque chose, ne renvoie rien:
void accept(T t)
Fournisseur: Ne prend rien, retourne quelque chose:
T get()
(inverse de Consumer, essentiellement une méthode `` getter '' universelle)3. Utilisation
Fournisseur: enroulez le code répétitif, par exemple la synchronisation d'exécution du code
la source
En termes profanes,
le fournisseur fournira des données mais sans consommer aucune donnée. En termes de programmation, une méthode qui ne prend aucun argument mais renvoie une valeur. Il est utilisé pour générer de nouvelles valeurs.
http://codedestine.com/java-8-supplier-interface/
Le consommateur consommera des données et ne retournera aucune donnée. En termes de programmation, une méthode qui prend plusieurs arguments et ne renvoie aucune valeur.
http://codedestine.com/java-8-consumer-interface/
la source
Le consommateur et le fournisseur sont les interfaces fournies par java. Le consommateur est utilisé pour itérer sur les éléments de la liste et le fournisseur est utilisé pour l'objet d'approvisionnement
vous pouvez facilement comprendre avec la démonstration de code.
Consommateur
Fournisseur
la source
La réponse la plus simple peut être:
Un consommateur peut être considéré comme une fonction <T, Void>. Un fournisseur peut être considéré comme une fonction <Void, T>.
la source