J'ai besoin d'une fonction de carte . Existe-t-il déjà quelque chose comme ça en Java?
(Pour ceux qui se demandent: je sais bien sûr implémenter moi-même cette fonction triviale ...)
java
map-function
Albert
la source
la source
Réponses:
Il n'y a pas de notion de fonction dans le JDK à partir de java 6.
Guava a une interface Function et la méthode fournit les fonctionnalités dont vous avez besoin.
Collections2.transform(Collection<E>, Function<E,E2>)
Exemple:
Production:
De nos jours, avec Java 8, il existe en fait une fonction de carte, donc j'écrirais probablement le code de manière plus concise:
la source
Collections2.transform(input -> Integer.toHexString(intput.intValue())
Depuis Java 8, il existe des options standard pour faire cela dans JDK:
Voir
java.util.Collection.stream()
etjava.util.stream.Collectors.toList()
.la source
toList()
. Remplacement par un type différent:(List<R>)((List) list).replaceAll(o -> doMap((E) o));
e -> doMap(e)
être remplacé par justedoMap
?foo::doMap
ouFoo::doMap
.Il existe une merveilleuse bibliothèque appelée Functional Java qui gère beaucoup de choses que vous voudriez que Java ait, mais ce n'est pas le cas. Là encore, il y a aussi ce merveilleux langage Scala qui fait tout ce que Java aurait dû faire mais ne le fait pas tout en étant compatible avec tout ce qui est écrit pour la JVM.
la source
a.map({int i => i + 42});
ont-ils étendu le compilateur? ou préprocesseur ajouté?Soyez très prudent avec
Collections2.transform()
de la goyave. Le plus grand avantage de cette méthode est aussi son plus grand danger: sa paresse.Regardez la documentation de
Lists.transform()
, qui, je crois, s'applique également àCollections2.transform()
:Dans la documentation,
Collections2.transform()
ils mentionnent également que vous obtenez une vue en direct, ce changement dans la liste source affecte la liste transformée. Ce type de comportement peut entraîner des problèmes difficiles à suivre si le développeur ne réalise pas comment cela fonctionne.Si vous voulez une "carte" plus classique, qui ne fonctionnera qu'une seule fois, alors vous feriez mieux d'utiliser
FluentIterable
, également depuis Guava, qui a une opération beaucoup plus simple. Voici l'exemple google pour cela:transform()
voici la méthode de la carte. Il utilise les mêmes fonctions <> "callbacks" queCollections.transform()
. La liste que vous récupérez est en lecture seule, utilisezcopyInto()
pour obtenir une liste en lecture-écriture.Sinon, bien sûr, lorsque java8 sortira avec des lambdas, ce sera obsolète.
la source
Voici une autre bibliothèque fonctionnelle avec laquelle vous pouvez utiliser map: http://code.google.com/p/totallylazy/
la source
Même si c'est une vieille question, j'aimerais montrer une autre solution:
Définissez simplement votre propre opération à l'aide des génériques java et des flux java 8:
Ensuite, vous pouvez écrire du code comme celui-ci:
la source