Comment transformer List en carte avec des collections Google?

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

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

Au 26/07/2012, Guava Master contient deux nouvelles façons de faire. Ils devraient être dans la version 14.0.

Maps.asMap(Set, Function) (et deux surcharges pour SortedSet et NavigableSet ) vous permet d’afficher un Set plus une Function sous forme de Map où la valeur de chaque clé de l’ensemble est la résultat de l’application de la fonction à cette clé. Le résultat est une vue, de sorte qu’il ne copie pas le jeu d’entrées et que le résultat de la Map changera comme le jeu et vice versa.

Maps.toMap(Iterable, Function) prend une Iterable et la 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é.

Utilisez Maps.uniqueIndex (Iterable, Function) :

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

Exemple:

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

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 des clés , il semble que vous puissiez simplement utiliser une carte de calcul, via MapMaker.makeComputingMap , et ignorer la liste d’entrée pour commencer. EDIT: Comme noté dans les commentaires, ceci est maintenant obsolète et supprimé dans Guava 15.0. Jetez un coup d’œil à CacheBuilder place.

D’autre part, cela ne vous donne pas non plus une carte qui renverra null si vous lui demandez une valeur correspondant à une clé qui ne figurait pas dans la liste pour commencer. En d’autres termes, cela pourrait ne pas être approprié, mais cela vaut la peine d’être considéré, en fonction de ce que vous essayez de faire avec. 🙂

Je vais laisser cette réponse ici à moins que vous ne commentiez qu’aucune des deux approches ne vous est utile, auquel cas je la supprimerai.


Réponse originale

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

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

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

Soit je vous ai mal compris ou les autres affiches ont. Je comprends que vous voulez que votre liste soit la clé 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 existe un problème Guava ouvert qui requirejs la fonctionnalité exacte que vous demandez, et j’ai également implémenté une telle solution pour une question précédente.

Utiliser Guava + Lamba

  Map map = Maps.uniqueIndex(YourList, YourCustomClass -> YourCustomClass.getKey());