Je viens de commencer à regarder Java 8 et pour essayer des lambdas, j'ai pensé essayer de réécrire une chose très simple que j'ai écrite récemment. Je dois transformer une carte de chaîne en colonne en une autre carte de chaîne en colonne où la colonne dans la nouvelle carte est une copie défensive de la colonne dans la première carte. La colonne a un constructeur de copie. Le plus proche que j'ai jusqu'à présent est:
Map<String, Column> newColumnMap= new HashMap<>();
originalColumnMap.entrySet().stream().forEach(x -> newColumnMap.put(x.getKey(), new Column(x.getValue())));
mais je suis sûr qu'il doit y avoir une meilleure façon de le faire et je serais reconnaissant pour quelques conseils.
Vous pouvez utiliser la
forEach
méthode pour faire ce que vous voulez.Ce que vous faites là-bas, c'est:
Ce que nous pouvons simplifier en un lambda:
Et comme nous appelons simplement une méthode existante, nous pouvons utiliser une référence de méthode , ce qui nous donne:
la source
originalColumnMap.forEach((string, column) -> newColumnMap.put(string, new Column(column)));
ou pourrais-je raccourcir cela?new Column(column)
comme paramètre, vous devrez y aller.La méthode sans réinsérer toutes les entrées dans la nouvelle carte devrait être la plus rapide, car elleHashMap.clone
effectue également une reprise en interne.la source
Map<String,Column> newColumnMap = new HashMap<>(originalColumnMap);
. Je ne sais pas si c'est différent sous les couvertures.Map
comportement de l' implémentation, c'est-à-dire que siMap
est anEnumMap
ou aSortedMap
, le résultat leMap
sera également. Dans le cas d'unSortedMap
avec un spécial,Comparator
cela peut faire une énorme différence sémantique. Eh bien, la même chose s'applique à unIdentityHashMap
…Restez simple et utilisez Java 8: -
la source
Si vous utilisez Guava (v11 minimum) dans votre projet, vous pouvez utiliser Maps :: transformValues .
Remarque: les valeurs de cette carte sont évaluées paresseusement. Si la transformation coûte cher, vous pouvez copier le résultat sur une nouvelle carte comme suggéré dans la documentation Guava.
la source
To avoid lazy evaluation when the returned map doesn't need to be a view, copy the returned map into a new map of your choosing.
Voici un autre moyen qui vous donne accès à la clé et à la valeur en même temps, au cas où vous auriez à faire une sorte de transformation.
la source
Si cela ne vous dérange pas d'utiliser des bibliothèques tierces, ma bibliothèque cyclops- react a des extensions pour tous les types de collections JDK , y compris Map . Vous pouvez utiliser directement les méthodes map ou bimap pour transformer votre carte. Un MapX peut être construit à partir d'une carte existante, par exemple.
Si vous souhaitez également changer la clé, vous pouvez écrire
bimap peut être utilisé pour transformer les clés et les valeurs en même temps.
À mesure que MapX étend la carte, la carte générée peut également être définie comme
la source