Goyave - Comment appliquer une fonction qui renvoie Void sur un Iterable
Je me demande juste quelle est la meilleure façon d'appliquer une fonction qui retourne Void
sur un Iterable/Collection
?
Mon cas d'utilisation est:
- j'ai une liste de
Animal
objets - je veux l'appeler à chaque animal de la liste, les
eat()
fonction
J'ai un Function<Animal,Void>
qui appelle input.eat();
Il s'avère que lorsque je l'appelle:
Collections2.transform(animalList,eatFunction);
Je n'ai pas trouver cela très élégant, puisque je ne suis pas à la recherche d'une transformation, mais seulement pour une application sans aucune sortie.
Pire, il n'a même pas de travail, depuis la Goyave, les transformations sont de retour vues.
Ce qui fonctionne bien est:
Lists.newArrayList( Collections2.transform(animalList,eatFunction) );
Mais ce n'est pas élégant.
Quel est le meilleur moyen pour appliquer une fonction Void à un objet iterable/Collection, d'une manière fonctionnelle avec de Goyave?
Modifier:
- Liés à la question: Inverse de Fournisseur<T> dans la Goyave
- Aussi comme Dzik, si vous utilisez Java8 au lieu de Goyave il y a le Consommateur de la classe: https://stackoverflow.com/a/32222080/82609
source d'informationauteur Sebastien Lorber
Vous devez vous connecter pour publier un commentaire.
Que pensez-vous est plus élégant? Un simple vieux pour la boucle:
ou une "courbure d'une langue de la procédure par écrit une procédure de fonctionnement dans un style fonctionnel de la" folie?
Je vote pour le premier cas.
Si vraiment vous souhaitez écrire vos programmes en style fonctionnel, je vous recommande de passer à une autre JVM langue au lieu d'effectuer un viol sur la vieille dame du nom de Java. 🙂
Scala peut être une bonne alternative pour un tel cas:
ou même une variante plus courte à l'aide de la
_
espace réservé:EDIT:
Après avoir essayé le code dans Eclipse, j'ai découvert que je devais ajouter
return null
déclaration à laeatFunction
parce que 1)Void
n'est pas le même quevoid
et 2) il est uninstantiable. C'est encore plus moche que prévu! 🙂Aussi du point de vue des performances, l'invocation du paresseux fonction à l'aide de certains constructeur de copie, comme ci-dessus aussi inutilement alloue de la mémoire. Un
ArrayList
de la même taille que leanimalList
seulement rempli avec les valeurs null est créé juste pour être immédiatement nettoyée.Si vous avez vraiment un cas d'utilisation où vous souhaitez passer autour de certains objets de fonction et de manière dynamique les appliquer sur certaines collections, je voudrais écrire ma propre interface fonctionnelle et un foreach méthode:
Alors vous pouvez même définir un
void
(en minuscules) fonction:Et de l'utiliser comme ceci:
Je viens de regarder pour la même chose et a trouvé un Java de l'interface de Consommateur.
Dans votre cas, il serait:
Comme d'autres l'ont souligné, la Goyave équipe a un point de vue qui s'oppose à cela. Si vous cherchez d'autres foncteur-comme APIs pour faire ce que vous voulez, vous pouvez vérifier Fonctionnel Java
Effet
ou Le JediCommande
de la classeou Jouer! cadre duF. Callback
ou Communes Collections4Fermeture
.