172 votes

Java: existe-t-il une fonction map?

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 ...)

110voto

leventov Points 2552

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() .

91voto

Sean Patrick Floyd Points 109428

Il n'y a pas de notion de fonction dans le JDK de java 6.

La goyave a une Fonction d'interface et le
Collections2.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]

27voto

wheaties Points 20917

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.

10voto

Emmanuel Touzery Points 1677

Ê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.

1voto

sushil bharwani Points 10138

Map(function,Iterable) je pense que ce style de codage est avec style fonctionnel de la langue, les langues qui prennent en charge la fonction de passage en tant qu’argument. Si ce n’est peut-être pas en java.

Prograide.com

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.

Powered by:

X