Java8: HashMap & lt; X, Y & gt; HashMap & lt; X, Z & gt; Verwenden von Stream / Map-Reduce / Collector
Ich wissen, wie Sie "transform" - eine einfache Java - List
aus Y
-> Z
d.h.:
List<String> x;
List<Integer> y = x.stream()
.map(s -> Integer.parseInt(s))
.collect(Collectors.toList());
Nun möchte ich tun im Grunde das gleiche mit einer Karte, also:
INPUT:
{
"key1" -> "41", //"41" and "42"
"key2" -> "42 //are Strings
}
OUTPUT:
{
"key1" -> 41, //41 and 42
"key2" -> 42 //are Integers
}
Die Lösung sollte nicht begrenzt werden, um String
-> Integer
. Genau wie in der List
Beispiel oben, würde ich mag, rufen Sie eine Methode (oder Konstruktor).
InformationsquelleAutor der Frage Benjamin M | 2014-09-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nicht ganz so schön wie die Liste code. Sie können nicht konstruieren neue
Map.Entry
s in einemmap()
nennen, so ist die Arbeit gemischt in diecollect()
nennen.InformationsquelleAutor der Antwort John Kugelman
Hier sind einige Variationen auf Sotirios Delimanolis' Antwortdie war ziemlich gut zu beginnen mit (+1). Betrachten Sie das folgende:
Ein paar Punkte hier. Die erste ist die Verwendung von wildcards in der Generika; das macht die Funktion etwas flexibler. Eine wildcard wäre notwendig, wenn, zum Beispiel, Sie wollten den Ausgang der Karte zu haben, ein Schlüssel, der eine Superklasse von der input-map-Schlüssel:
(Dort ist auch ein Beispiel für die Karte die Werte, aber es ist wirklich zu konstruiert, und ich gebe zu, dass die bounded wildcard für die Y-hilft nur in Rand-Fällen.)
Zweite Punkt ist, dass, anstatt den Strom über die input map ' s
entrySet
ich rannte ihn über denkeySet
. Das macht den code ein wenig sauberer, ich denke, bei den Kosten, die zum abrufen der Werte aus der Karte statt der von den map-Eintrag. Übrigens hatte ich anfangskey -> key
als erstes argumenttoMap()
und dies nicht mit einer Typ-Inferenz-Fehler aus irgendeinem Grund. Ändern Sie es zu(X key) -> key
gearbeitet, wieFunction.identity()
.Immer noch eine andere Variante ist wie folgt:
Diese verwendet
Map.forEach()
statt streams. Dieser ist sogar noch einfacher, denke ich, weil es keine Sammler, die etwas schwerfällig zu bedienen mit Karten. Der Grund dafür ist, dassMap.forEach()
gibt den Schlüssel und den Wert als einzelne Parameter, in der Erwägung, dass der stream hat nur einen Wert -- und Sie haben die Wahl, ob Sie die-Taste oder die map-Eintrag als Wert. Auf der minus-Seite, diese fehlt den reichen, streamy Güte der anderen Ansätze. 🙂InformationsquelleAutor der Antwort Stuart Marks
Einer generischen Lösung, wie so
Beispiel
InformationsquelleAutor der Antwort Sotirios Delimanolis
Tut es absolut und zu 100% funktionsfähig und fließend? Wenn nicht, wie wäre es damit, das ist etwa so kurz wie es geht:
(wenn Sie Leben können mit der Scham und Schuld, der Kombination von strömen mit Nebenwirkungen)
InformationsquelleAutor der Antwort Lukas Eder
Meine StreamEx Bibliothek, die verbessert die standard-Streams-API bietet eine
EntryStream
Klasse, die passt besser für die Transformation von Karten:InformationsquelleAutor der Antwort Tagir Valeev
Guave Funktion
Karten.transformValues
ist, was Sie suchen, und es funktioniert gut mit lambda-Ausdrücken:InformationsquelleAutor der Antwort Alex Krauss
Eine alternative, die immer vorhanden ist, für das lernen Zweck ist es, erstellen Sie Ihre eigene Sammler über Sammler.() obwohl toMap() der JDK-Sammler hier wird lapidar (+1 hier) .
InformationsquelleAutor der Antwort Ira
Wenn Euch das nichts ausmacht mit 3rd-party-Bibliotheken, meine cyclops-reagieren lib hat Erweiterungen für alle JDK-Collection - Typen, einschließlich Anzeigen. Wir können nur verwandeln die Karte direkt über die 'map' - operator (standardmäßig wird die Karte wirkt auf die Werte in der map).
bimap kann verwendet werden, um umzuwandeln die Schlüssel und Werte gleichzeitig
InformationsquelleAutor der Antwort John McClean
Deklarativen und einfachere Lösung wäre :
yourMutableMap.replaceAll((key, val) -> return_value_of_bi_your_function);
Nb. sich bewusst sein, Ihre änderung Ihrer Karte Stand. Also das kann nicht sein, was Sie wollen.
Cheers :
http://www.deadcoderising.com/2017-02-14-java-8-declarative-ways-of-modifying-a-map-using-compute-merge-and-replace/
InformationsquelleAutor der Antwort Breton F.