Ich habe gerade angefangen, mir Java 8 anzuschauen und Lambdas auszuprobieren. Ich dachte, ich würde versuchen, eine sehr einfache Sache, die ich kürzlich geschrieben habe, neu zu schreiben. Ich muss eine Map von String zu Column in eine andere Map von String zu Column umwandeln, wobei die Column in der neuen Map eine defensive Kopie der Column in der ersten Map ist. Die Spalte hat einen Kopierkonstruktor. Das nächste, was ich bisher habe, ist:
Map<String, Column> newColumnMap= new HashMap<>();
originalColumnMap.entrySet().stream().forEach(x -> newColumnMap.put(x.getKey(), new Column(x.getValue())));
aber ich bin sicher, es muss einen schöneren Weg geben, und ich wäre dankbar für einige Ratschläge.
Mit der
forEach
Methode können Sie tun, was Sie wollen.Was Sie dort tun, ist:
Was wir zu einem Lambda vereinfachen können:
Und weil wir nur eine vorhandene Methode aufrufen, können wir eine Methodenreferenz verwenden , die uns Folgendes gibt:
quelle
originalColumnMap.forEach((string, column) -> newColumnMap.put(string, new Column(column)));
oder könnte ich das verkürzen?new Column(column)
als Paremeter haben, damit fortfahren.Der Weg ohne erneutes Einfügen aller Einträge in die neue Karte sollte der schnellste sein, der nicht möglich ist, da auchHashMap.clone
intern einerneutesAufwärmen durchgeführt wird.quelle
Map<String,Column> newColumnMap = new HashMap<>(originalColumnMap);
. Ich weiß nicht, ob es unter der Decke anders ist.Map
Verhalten der Implementierung beibehalten wird, dh wennMap
es sich um einEnumMap
oder ein handeltSortedMap
, ist dies auch das ErgebnisMap
. Im Falle einesSortedMap
mit einem speziellen kannComparator
es einen großen semantischen Unterschied machen. Na ja, das gilt auch für einenIdentityHashMap
…Halten Sie es einfach und verwenden Sie Java 8: -
quelle
Wenn Sie in Ihrem Projekt Guava (mindestens Version 11) verwenden, können Sie Maps :: transformValues verwenden .
Hinweis: Die Werte dieser Karte werden träge ausgewertet. Wenn die Umwandlung teuer ist, können Sie das Ergebnis auf eine neue Karte kopieren, wie in den Guava-Dokumenten vorgeschlagen.
quelle
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.
Hier ist eine andere Möglichkeit, mit der Sie gleichzeitig auf den Schlüssel und den Wert zugreifen können, falls Sie eine Transformation durchführen müssen.
quelle
Wenn es Ihnen nichts ausmacht, Bibliotheken von Drittanbietern zu verwenden, enthält meine Cyclops-React- Bibliothek Erweiterungen für alle JDK-Sammlungstypen , einschließlich Map . Sie können die Karten- oder Bimap-Methoden direkt verwenden, um Ihre Karte zu transformieren. Ein MapX kann aus einer vorhandenen Map erstellt werden, z.
Wenn Sie auch den Schlüssel ändern möchten, können Sie schreiben
Mit bimap können die Schlüssel und Werte gleichzeitig transformiert werden.
Wenn MapX Map erweitert, kann die generierte Map auch als definiert werden
quelle