web-dev-qa-db-fra.com

Comment transformer List <String> en Map <String, String> avec les collections Google?

J'ai une liste de chaînes et j'ai une fonction pour générer une valeur pour chaque clé de la liste.

Je veux créer une carte en utilisant cette fonction. Puis-je le faire avec les collections Google?

51
oshai

Depuis le 26/07/2012, le maître de la goyave contient deux nouvelles façons de le faire. Ils devraient être dans la version 14.0.

Maps.asMap(Set<K>, Function<? super K, V>) (et deux surcharges pour SortedSet et NavigableSet) vous permet d'afficher un Set plus un Function comme un Map où la valeur de chaque clé de l'ensemble est le résultat de l'application de la fonction à cette clé. Le résultat est une vue, donc il ne copie pas le jeu d'entrée et le résultat Map changera comme le fait le jeu et vice versa.

Maps.toMap(Iterable<K>, Function<? super K, V>) prend un Iterable et le convertit avec empressement en ImmutableMap où les éléments distincts de l'itérable sont les clés et les valeurs sont les résultats de l'application de la fonction à chaque clé .

23
ColinD

Utilisez Maps.uniqueIndex (Iterable, Function) :

Renvoie une carte immuable pour laquelle les Map.values ​​() sont les éléments donnés dans l'ordre donné, et chaque clé est le produit de l'appel d'une fonction fournie sur sa valeur correspondante . (de javadoc)

Exemple:

Map<String,String> mappedRoles = Maps.uniqueIndex(yourList, new Function<String,String>() {
  public String apply(String from) {
    // do stuff here
    return result;
  }});
88
dogbane

EDIT: Il est tout à fait possible que Sean ait raison et j'ai mal compris la question.

Si la liste d'origine est censée être touches, il semble que vous pourriez simplement utiliser une carte informatique, via MapMaker.makeComputingMap , et ignorez la liste d'entrée pour commencer. EDIT: Comme indiqué dans les commentaires, cela est désormais obsolète et supprimé dans Guava 15.0. Jetez un œil à CacheBuilder à la place.

D'un autre côté, cela ne vous donne pas non plus une carte qui retournera null si vous lui demandez une valeur correspondant à une clé qui n'était pas dans la liste pour commencer. Cela ne vous donnera pas non plus En d'autres termes, cela pourrait bien pas être approprié, mais cela vaut la peine d'être considéré, selon ce que vous essayez de faire avec. :)

Je vais laisser cette réponse ici, sauf si vous commentez que l'approche ni ici vous est utile, auquel cas je la supprimerai.


Réponse originale

En utilisant Guava vous pouvez le faire assez facilement avec Maps.uniqueIndex :

Map<String, String> map = Maps.uniqueIndex(list, keyProjection);

(J'ai mentionné spécifiquement Guava par opposition aux collections Google, car je n'ai pas vérifié si l'ancien référentiel de collections Google comprend Maps.uniqueIndex.)

15
Jon Skeet

Soit je vous ai mal compris, soit les autres affiches l'ont fait. Je comprends que vous voulez que votre liste soit les clés de la carte, tandis que Maps.uniqueIndex() crée des clés pour mapper à vos valeurs (ce qui est tout le contraire).

Quoi qu'il en soit, il y a un problème de goyave ouvert qui demande la fonctionnalité exacte que vous demandez, et j'ai également implémenté une telle solution pour une question précédente.

13
Sean Patrick Floyd

Utilisation de Goyave + Lamba

 Map<String, YourCustomClass> map = Maps.uniqueIndex(YourList, YourCustomClass -> YourCustomClass.getKey());
6
Carlos