J'ai besoin d'une fonction de carte . Y a-t-il déjà quelque chose comme ça en Java?
(Pour ceux qui se demandent: je sais bien sûr comment mettre en œuvre cette fonction triviale moi-même ...)
J'ai besoin d'une fonction de carte . Y a-t-il déjà quelque chose comme ça en Java?
(Pour ceux qui se demandent: je sais bien sûr comment mettre en œuvre cette fonction triviale moi-même ...)
Depuis Java 8, il existe certaines options standard pour le faire dans JDK:
Collection<E> in = ...
Object[] mapped = in.stream().map(e -> doMap(e)).toArray();
// or
List<E> mapped = in.stream().map(e -> doMap(e)).collect(Collectors.toList());
Voir java.util.Collection.stream()
et java.util.stream.Collectors.toList()
.
Il n'y a pas de notion de fonction dans le JDK de java 6.
La goyave a une Fonction d'interface et leCollections2.transform(Collection<E>, Function<E,E2>)
la méthode fournit les fonctionnalités dont vous avez besoin.
Exemple:
// example, converts a collection of integers to their
// hexadecimal string representations
final Collection<Integer> input = Arrays.asList(10, 20, 30, 40, 50);
final Collection<String> output =
Collections2.transform(input, new Function<Integer, String>(){
@Override
public String apply(final Integer input){
return Integer.toHexString(input.intValue());
}
});
System.out.println(output);
Sortie:
[a, 14, 1e, 28, 32]
Il existe une merveilleuse bibliothèque appelée Functional Java, qui gère la plupart des choses que vous voudriez que Java possède, mais qui ne le font pas. Encore une fois, il y a aussi ce merveilleux langage Scala qui fait tout ce que Java aurait dû faire mais ne le fait pas tout en restant compatible avec tout ce qui est écrit pour la JVM.
Être très prudent avec l' Collections2.transform()
de la 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 à l' Collections2.transform()
:
La fonction est appliquée paresseusement, invoquée en cas de besoin. Cela est nécessaire pour la liste retournée à être vue, mais cela signifie que la fonction sera appliqué à plusieurs reprises pour des opérations en bloc comme Liste.contient(java.lang.De l'objet) et de la Liste.hashCode(). Pour cela bien, la fonction devrait être rapide. Pour éviter d'évaluation différée lorsque la liste retournée n'a pas besoin d'être vue, copie de la liste retournée dans une nouvelle liste de votre choix.
Également dans la documentation de l' 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, "à la 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 l'exemple google:
FluentIterable
.from(database.getClientList())
.filter(activeInLastMonth())
.transform(Functions.toStringFunction())
.limit(10)
.toList();
transform()
ici est la méthode la carte. Il utilise la même Fonction<> "rappels", comme l' Collections.transform()
. La liste que vous obtenez en retour est en lecture seule, utilisez alors copyInto()
pour obtenir une lecture-écriture de la liste.
Sinon bien sûr, quand java8 sort avec des lambdas, ce sera obsolète.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.