Récemment , j'ai conversation avec un collègue au sujet de ce qui serait la meilleure façon de convertir List
à Map
Java et s'il y a des avantages spécifiques de le faire.
Je veux connaître l'approche de conversion optimale et j'apprécierais vraiment que quelqu'un puisse me guider.
Est-ce une bonne approche:
List<Object[]> results;
Map<Integer, String> resultsMap = new HashMap<Integer, String>();
for (Object[] o : results) {
resultsMap.put((Integer) o[0], (String) o[1]);
}
Réponses:
En supposant bien sûr que chaque élément possède une
getKey()
méthode qui renvoie une clé du type approprié.la source
getKey()
sur un paramètre spécifique?getKey()
était arbitraire.Avec java-8, vous pourrez le faire sur une seule ligne en utilisant des flux et la
Collectors
classe.Démo courte:
Production:
Comme indiqué dans les commentaires, vous pouvez utiliser à la
Function.identity()
place deitem -> item
, bien que je trouvei -> i
plutôt explicite.Et pour être complet, notez que vous pouvez utiliser un opérateur binaire si votre fonction n'est pas bijective. Par exemple, considérons ceci
List
et la fonction de mappage que pour une valeur int, calculons le résultat de celle-ci modulo 3:Lors de l'exécution de ce code, vous obtiendrez une erreur indiquant
java.lang.IllegalStateException: Duplicate key 1
. En effet, 1% 3 est identique à 4% 3 et a donc la même valeur de clé compte tenu de la fonction de mappage de clé. Dans ce cas, vous pouvez fournir un opérateur de fusion.En voici un qui additionne les valeurs;
(i1, i2) -> i1 + i2;
qui peut être remplacé par la référence de méthodeInteger::sum
.qui génère désormais:
J'espère que ça aide! :)
la source
Function.identity()
au lieu deitem -> item
Function.identity()
revientt -> t;
.::getKey
.Juste au cas où cette question ne serait pas fermée en double, la bonne réponse consiste à utiliser Google Collections :
la source
En utilisant Java 8, vous pouvez faire ce qui suit:
Value
peut être n'importe quel objet que vous utilisez.la source
Depuis Java 8, la réponse de @ZouZou en utilisant le
Collectors.toMap
collecteur est certainement le moyen idiomatique de résoudre ce problème.Et comme c'est une tâche si courante, nous pouvons en faire un utilitaire statique.
De cette façon, la solution devient vraiment une ligne.
Et voici comment l'utiliser sur
List<Student>
:la source
A
List
etMap
sont conceptuellement différents. AList
est une collection d'articles ordonnée. Les éléments peuvent contenir des doublons et un élément peut ne pas avoir de concept d'identifiant unique (clé). AMap
a des valeurs mappées sur des clés. Chaque clé ne peut pointer que vers une seule valeur.Par conséquent, selon vos
List
articles, il peut ou non être possible de le convertir en aMap
. Est-ce que vosList
articles n'ont pas de doublons? Chaque article a-t-il une clé unique? Si oui, il est possible de les mettre dans un fichierMap
.la source
Alexis a déjà posté une réponse en Java 8 en utilisant la méthode
toMap(keyMapper, valueMapper)
. Selon le doc pour cette implémentation de la méthode:Donc, dans le cas où nous sommes intéressés par une implémentation spécifique de l'
Map
interface, par exemple,HashMap
nous pouvons utiliser le formulaire surchargé comme:Bien que l'utilisation de soit
Function.identity()
oui->i
soit très bien, mais il sembleFunction.identity()
au lieu dei -> i
peut économiser de la mémoire selon cette réponse associée .la source
Il existe également un moyen simple de le faire en utilisant Maps.uniqueIndex (...) de Googlegoyave bibliothèques
la source
Méthode universelle
la source
converter
paramètre dans la méthode?Sans java-8, vous pourrez le faire dans des collections Commons en une seule ligne et dans la classe Closure
la source
De nombreuses solutions viennent à l'esprit, selon ce que vous souhaitez réaliser:
Chaque élément de la liste est une clé et une valeur
Les éléments de liste ont quelque chose à rechercher, peut-être un nom:
Les éléments de liste ont quelque chose à rechercher, et il n'y a aucune garantie qu'ils soient uniques: utilisez Google Maps MultiMaps
Donner à tous les éléments la position comme clé:
...
Cela dépend vraiment de ce que vous voulez atteindre.
Comme vous pouvez le voir dans les exemples, une carte est un mappage d'une clé à une valeur, tandis qu'une liste n'est qu'une série d'éléments ayant chacun une position. Ils ne sont donc tout simplement pas convertibles automatiquement.
la source
Voici une petite méthode que j'ai écrite exactement dans ce but. Il utilise Validate d'Apache Commons.
Sentez-vous libre de l'utiliser.
la source
Vous pouvez tirer parti de l'API streams de Java 8.
Pour plus de détails, visitez: http://codecramp.com/java-8-streams-api-convert-list-map/
la source
Un exemple Java 8 pour convertir un
List<?>
des objets enMap<k, v>
:Code copié depuis:
https://www.mkyong.com/java8/java-8-convert-list-to-map/
la source
comme déjà dit, en java-8, nous avons la solution concise de Collectors:
et aussi, vous pouvez imbriquer plusieurs groupes en passant une autre méthode groupingBy comme deuxième paramètre:
De cette façon, nous aurons une carte à plusieurs niveaux, comme ceci:
Map<key, Map<key, List<Item>>>
la source
Utilisation de flux Java-8
la source
J'aime la réponse de Kango_V, mais je pense que c'est trop complexe. Je pense que c'est plus simple - peut-être trop simple. S'il est incliné, vous pouvez remplacer String par un marqueur générique et le faire fonctionner pour n'importe quel type de clé.
Utilisé comme ceci:
la source
Apache Commons MapUtils.populateMap
Si vous n'utilisez pas Java 8 et que vous ne souhaitez pas utiliser une boucle explicite pour une raison quelconque, essayez à
MapUtils.populateMap
partir d'Apache Commons.MapUtils.populateMap
Disons que vous avez une liste de l'
Pair
art.Et vous voulez maintenant une carte de la
Pair
clé de l'Pair
objet.donne la sortie:
Cela étant dit, une
for
boucle est peut-être plus facile à comprendre. (Ce qui suit donne la même sortie):la source