webentwicklung-frage-antwort-db.com.de

Java 8: Wie konvertiere ich String nach Map <String, String>?

Ich habe eine Karte:

Map<String, String> utilMap = new HashMap();
utilMap.put("1","1");
utilMap.put("2","2");
utilMap.put("3","3");
utilMap.put("4","4");

Ich habe es in einen String umgewandelt:

String utilMapString = utilMap
                .entrySet()
                .stream()
                .map(e -> e.toString()).collect(Collectors.joining(","));
Out put: 1=1,2=2,3=3,4=4,5=5

Wie konvertiere ich utilMapString nach Map in Java8? Mit wem kann ich helfen?

3
Phuong

Teilen Sie die Zeichenfolge in ,, um einzelne Map-Einträge zu erhalten. Teilen Sie sie dann mit = auf, um den Schlüssel und den Wert zu erhalten.

Map<String, String> reconstructedUtilMap = Arrays.stream(utilMapString.split(","))
            .map(s -> s.split("="))
            .collect(Collectors.toMap(s -> s[0], s -> s[1]));

Hinweis: Wie von Andreas @ in den Kommentaren ausgeführt, ist dies keine zuverlässige Methode zum Konvertieren zwischen einer Karte und einem String

EDIT: Vielen Dank an Holger für diesen Vorschlag.

Verwenden Sie s.split("=", 2), um sicherzustellen, dass das Array niemals größer als zwei Elemente ist. Dies ist nützlich, um den Inhalt nicht zu verlieren (wenn der Wert = hat)

Beispiel: Wenn die Eingabezeichenfolge "a=1,b=2,c=3=44=5555" Ist, erhalten Sie {a=1, b=2, c=3=44=5555}

Früher (nur mit s.split("=")) erhalten Sie {a=1, b=2, c=3}

6
user7

Hier ist eine weitere Option, die eine Liste von 1=1 usw.-Begriffen in eine Karte einströmt.

String input = "1=1,2=2,3=3,4=4,5=5";
Map<String, String> map = Arrays.asList(input.split(",")).stream().collect(
             Collectors.toMap(x -> x.replaceAll("=\\d+$", ""),
                 x -> x.replaceAll("^\\d+=", "")));
System.out.println(Collections.singletonList(map));

[{1=1, 2=2, 3=3, 4=4, 5=5}]
1
Tim Biegeleisen

Wenn Sie eine Map aus String generieren möchten, können Sie dies mit dem folgenden Weg tun:

Map<String, String> newMap = Stream.of(utilMapString.split("\\,"))
            .collect(Collectors.toMap(t -> t.toString().split("=")[0], t -> t.toString().split("=")[1]));
0
Amit

Wenn die Sequenz Werte mit demselben Schlüssel enthalten kann, verwenden Sie

Map<String, String> skipDuplicatesMap = Stream.of("1=1,2=2,3=3,4=4,5=5".split(",")).
            map(el -> el.split("=")).
            collect(toMap(arr -> arr[0], arr -> arr[1], (oldValue, newValue) -> oldValue));
0
Azee