Java: est-il d'une carte de fonction?
J'ai besoin d'un carte fonction. Est là quelque chose comme cela en Java déjà?
(Pour ceux qui se demandent: bien sûr, je sais comment mettre en place cette triviale fonction de moi-même...)
- Si non, il est trivial de définir vous-même. Mais je suppose que google connaît une douzaine d'implémentations?
- Double (plutôt plus) dans le stackoverflow.com/questions/3907412/...
- Comment est-elle la même question?
- Ce n'est pas la même question. Il est étroitement lié, par contre...
- Si la réponse à cette question est oui, il répond également à l'autre lié à la question. Si la réponse est non (et il me semble), ils sont totalement indépendants.
- ah juste assez, vous avez raison. Excuses
- Groovy a construit dans cette si vous pouvez l'utiliser.
- Comme de Java8, c'est Ce que @delnan peut-être allusion à leveluplunch.com/java/examples/...
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de notion de fonction dans le JDK de java 6.
Goyave a un La fonction interface, bien que l'
Collections2.transformer(Collection<E>, la Fonction<E,E2>)
la méthode fournit les fonctionnalités dont vous avez besoin.
Exemple:
De sortie:
Ces jours-ci, avec Java 8, il est en fait une fonction map, alors je serais probablement écrire le code d'une manière plus concise:
Collections2.transform(input -> Integer.toHexString(intput.intValue())
Depuis Java 8, il y a quelques options standard pour ce faire, dans le JDK:
Voir
java.util.Collection.stream()
etjava.util.flux de données.Des collectionneurs.toList()
.ArrayList.replaceAll
.stream()
ouparallelStream()
, la collecte de Liste ou d'un Ensemble, etc. Mais je suis d'accord, il devrait y avoir des raccourcis pour la plupart des cas d'utilisation courants.replaceAll()
ne peut pas la carte d'un type différent, n'est utilisable que pour les listes, et modifie la liste d'origine. Ce n'est pas bon. Je peux accepter que vous avez besoin pour créer unStream
de chaque collection, avant de vous pouvez effectuer certaines opérations fonctionnelles, mais pourquoi, OH POURQUOI ne sont-ils pastoList()
,toSet()
etc. des méthodes directement sur elle? L'enfer qui se soucie de certains collectionneurs? Je veux juste map/filter une collection.toList()
. Remplacement de type différent:(List<R>)((List) list).replaceAll(o -> doMap((E) o));
Collections2.transform
avec un lambda. Qui est assez laconique, mais il est décevant de constater qu'il n'y a pas de façon laconique à la carte d'une collection dans la JRE. OMICollection
doit avoir été donnémap
etfilter
avec des implémentations par défaut.e -> doMap(e)
être remplacé par seulementdoMap
?foo::doMap
ouFoo::doMap
.[1, 2, 3].collect { it * 2 } //result: [2, 4, 6]
Ça va être un super moment!Il y a une magnifique bibliothèque appelée Fonctionnel Java qui s'occupe de beaucoup de choses que vous voulez Java, mais il ne le fait pas. Puis de nouveau, il y a aussi ce merveilleux langage Scala qui fait tout Java doit avoir fait, mais n'a pas, tout en restant compatible avec ce qui est écrit pour la JVM.
a.map({int i => i + 42});
ont-ils étendre compilateur? ou ajouté de préprocesseur?Être très prudent avec
Collections2.transform()
de goyave.Cette méthode est plus grand avantage est aussi son plus grand danger: sa paresse.
Regardez la documentation de
Lists.transform()
, qui, je crois, s'applique également àCollections2.transform()
:Également dans la documentation de
Collections2.transform()
ils mentionnent vous obtenez une vue en direct, que le changement dans la liste source d'affecter la transformée de liste. Ce genre de comportement peut entraîner difficiles à repérer des problèmes si le développeur ne se rend pas compte de la façon dont il fonctionne.Si vous voulez un style plus classique, "carte", ce qui sera une fois et une fois seulement, alors vous êtes mieux avec
FluentIterable
, également à partir de Goyave, qui a un fonctionnement qui est beaucoup plus simple. Voici le google exemple:transform()
ici est la méthode la carte. Il utilise la même Fonction<> "rappels" commeCollections.transform()
. La liste que vous obtenez en retour est en lecture seule, utilisez alorscopyInto()
pour obtenir une lecture-écriture de la liste.Sinon bien sûr, quand java8 sort avec des lambdas, ce sera obsolète.
C'est une autre fonctionnelle lib avec qui vous pouvez utiliser la carte: http://code.google.com/p/totallylazy/
Même si c'est une vieille question que j'aimerais vous montrer une autre solution:
Il suffit de définir votre propre exploitation à l'aide de java génériques et de java 8 flux:
Que vous pouvez écrire du code comme ceci: