Question

je besoin d'un map fonction. Y at-il quelque chose comme ça en Java déjà?

(Pour ceux qui se demandent: Je sais bien sûr de la façon de mettre en œuvre moi-même cette fonction triviale ...)

Était-ce utile?

La solution

Il n'y a aucune notion de fonction dans le JDK de Java 6.

Goyave a un l'interface de fonction bien et
Collections2.transform(Collection<E>, Function<E,E2>)
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]

Ces jours-ci, avec Java 8, il est en fait une fonction de carte, donc je serais probablement écrire le code d'une manière plus concise de:

Collection<String> hex = input.stream()
                              .map(Integer::toHexString)
                              .collect(Collectors::toList);

Autres conseils

Depuis Java 8, il y a quelques options standard pour le faire dans le 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 y a une merveilleuse bibliothèque appelée fonctionnelle Java qui gère la plupart des choses que vous voudriez Java d'avoir mais ne fonctionne pas. Là encore, il y a aussi cette langue merveilleuse Scala qui fait tout Java aurait dû le faire, mais ne pas tout en étant compatible avec quoi que ce soit écrit pour la machine virtuelle Java.

Soyez très prudent avec Collections2.transform() de goyave. plus grand avantage est aussi le plus grand danger de cette méthode:. sa paresse

Regardez la documentation de Lists.transform(), que je crois applique aussi Collections2.transform():

  

La fonction est appliquée paresseusement, invoqué en cas de besoin. Ceci est nécessaire   pour la liste renvoyée à une vue, mais cela signifie que la fonction   sera appliqué à plusieurs reprises pour des opérations en vrac comme   List.contains (java.lang.Object) et List.hashCode (). Pour que cela   bien performer, la fonction doit être rapide. Pour éviter l'évaluation paresseuse quand   la liste retournée n'a pas besoin d'être une vue, copier la liste renvoyée   dans une nouvelle liste de votre choix.

également dans la documentation de Collections2.transform() ils mentionnent que vous obtenez une vue en direct, que le changement dans la liste des sources affecte la liste transformée. Ce genre de comportement peut conduire à des problèmes difficiles à piste si le développeur ne se rend pas compte de la façon dont il fonctionne.

Si vous voulez une « carte » plus classique, qui se déroulera une fois et une seule fois, vous êtes mieux avec FluentIterable , également de goyave, qui a une opération qui est beaucoup plus simple. Voici l'exemple de Google pour elle:

FluentIterable
       .from(database.getClientList())
       .filter(activeInLastMonth())
       .transform(Functions.toStringFunction())
       .limit(10)
       .toList();

transform() est la méthode de carte ici. Il utilise la même fonction <> « callbacks » comme Collections.transform(). La liste vous revenez est en lecture seule si, utilisez copyInto() pour obtenir une liste de lecture-écriture.

Sinon bien sûr quand java8 sort avec lambdas, ce sera obsolète.

Ceci est un autre lib fonctionnel avec lequel vous pouvez utiliser la carte: http://code.google.com / p / totallylazy /

sequence(1, 2).map(toString); // lazily returns "1", "2"

Bien que ce soit une vieille question que je voudrais montrer une autre solution:

Il suffit de définir votre propre opération à l'aide des génériques java et java 8 flux:

public static <S, T> List<T> mapAll(Collection<S> collection, Function<S, T> mapper) {
   return collection.stream().map(mapper).collect(Collectors.toList());
}

Que vous pouvez écrire du code comme ceci:

List<String> hex = mapAll(Arrays.asList(10, 20, 30, 40, 50), Integer::toHexString);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top