Wie konvertieren von Map<String, String> auf Karte<Long, String> ? (option : mit Guave)
Ich habe eine Map<String, String>
die String
Schlüssel ist nichts anderes als numerischen Wert wie "123" usw. Ich bin immer numerische Wert, da diese Werte kommen aus der Benutzeroberfläche in meiner JSF-Komponente. Ich will nicht zu ändern, der Vertrag von UI-Komponente.
Jetzt würde ich gerne eine Map<Long, String>
basierend auf den oben genannten Map
sah ich einige transform
Methoden in der Maps
Klasse, aber alle konzentrieren sich auf die Umwandlung von Wert-und nicht-Schlüssel.
Gibt es einen besseren Weg, um zu konvertieren Map<String, String>
zu Map<Long, String>
?
- Ich glaube nicht, dass es eine built-in Funktion für diese. Eine obwohl, ich sehe nicht viel Verwendung für dieses, möchten Sie vielleicht zu Datei eine feature-Anfrage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
UPDATE für Java 8
Können Sie streams zu tun:
Dies setzt Voraus, dass alle Schlüssel gültig sind string-Darstellungen von
Long
s. Sie können auch Kollisionen beim transformieren; zum Beispiel"0"
und"00"
beide anzeigen zu0L
.Ich würde denken, dass Sie würde haben, Durchlaufen Sie die map:
Dieser code geht davon aus, dass Sie desinfiziert haben, alle Werte in
map
(also keine ungültigen long-Werten).Ich hoffe es gibt eine bessere Lösung.
BEARBEITEN
ich kam über dieKratzer, es funktioniert nur für Klassen, implementierenCollectionUtils#transformedCollection(Sammlung, Transformator)
Methode in der Commons-Sammlung-Utils, wie es aussieht, könnten tun, was Sie wollen.Collection
.O(n)
. Ich kann mir nicht vorstellen, dass es eine Weise können Sie tun dies so, dass es besser ist alsO(n)
.@Vivin s Antwort ist richtig, aber ich denke, es ist nützlich, zu erklären, warum Guave nicht jede Methode zu erlauben, Sie zu transformieren, die Tasten einer
Map
(oder zu transformieren eineSet
überhaupt).Alle Guave Methoden für die Transformation und die Filterung produzieren lazy Ergebnisse... der Funktion/Prädikat wird nur angewendet, wenn nötig, als Objekt verwendet wird. Sie schaffen keine Kopien. Weil, dass, obwohl eine transformation kann leicht brechen, die den Anforderungen einer
Set
.Sagen wir zum Beispiel, Sie haben eine
Map<String, String>
enthält sowohl "1" und "01" als Schlüssel. Sie sind beide unterschiedlicheString
s, und so dieMap
kann rechtlich enthalten, die sowohl als Schlüssel. Wenn Sie wandeln Sie mitLong.valueOf(String)
, obwohl, Sie Karte, um den Wert1
. Sie sind nicht mehr verschiedene Schlüssel. Dies ist nicht, etwas zu brechen, wenn Sie erstellen eine Kopie der Karte und fügen Sie die Einträge, da keine doppelten Schlüssel überschreibt den vorherigen Eintrag für diesen Schlüssel. Ein träge verwandeltMap
würde jedoch keine Möglichkeit haben, die Durchsetzung der eindeutige Schlüssel, und daher würde brechen den Vertrag von einemMap
.Können Sie jetzt mit Java 8 stream, ansehen, sammeln, dies in einem besser lesbaren, sauberen Art und Weise.
Hier ist eine aktualisierte version von einer der Antworten, um die resultierende Karte unveränderbar (Nein, es ist nicht mit Guave, einfach nur Java 8):
Die kurze Antwort ist Nein, Guave nicht diese eine aus der box.
Der einfache Weg wäre so etwas wie unten. Es gibt einige Hinweise, jedoch.
Guave Transformatoren sind alle "faul" - oder view-Basis. Ich denke, eine Karte zu implementieren key Transformator, würden Sie wollen eine zwei-Wege-Funktion. Mein Verständnis ist, dass es einen Konverter, der in den Werken der Guave-team, die würden das problem lösen.
Dem anderen problem, das Sie in ausgeführt wird, dass Sie hätte Umgang mit der Möglichkeit von Duplikaten in Ordnung zu sein "Jimmy-proof", ein weiterer Guave-Prinzip. Eine Möglichkeit damit umzugehen wäre, um wieder eine Multimap; ein weiterer wäre, eine Ausnahme werfen, wenn Sie auf Duplikate. Was würde ich nicht vorschlagen, versteckt sich das problem z.B. durch ignorieren nachfolgenden Einträge mit doppelten Schlüssel, oder durch überschreiben der neue Eintrag mit dem doppelten Schlüssel.
Bester post ever zu liefern, off-the-shelf arbeiten, Lösungen für diese zu finden hier:
Transform HashMap in Java 8
Diese Seite zeigt alle 3 möglichen Fällen: