web-dev-qa-db-ja.com

Java 8:文字列をMap <String、String>に変換する方法?

私は地図を持っています:

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

私はそれを文字列に変換しました:

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

Java8でutilMapStringをMapに変換する方法は?誰が私を助けてくれますか?

5
Phuong

文字列を_,_で分割して、個々のマップエントリを取得します。次に、それらを_=_で分割して、キーと値を取得します。

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

注:Andreas @がコメント で指摘しているように、これはマップと文字列の間で変換する信頼できる方法ではありません

[〜#〜] edit [〜#〜]:この提案をしてくれたHolgerに感謝します。

s.split("=", 2)を使用して、配列が2つの要素より大きくならないようにします。これは、内容が失われないようにするのに役立ちます(値に_=_がある場合)

例:入力文字列が_"a=1,b=2,c=3=44=5555"_の場合、_{a=1, b=2, c=3=44=5555}_が返されます

以前(s.split("=")を使用するだけ)は_{a=1, b=2, c=3}_

6
user7

これは、1=1などの用語のリストをマップにストリーミングする別のオプションです。

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

あなたが文字列からマップを生成したい場合は、以下の方法でそれを行うことができます:

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

シーケンスに同じキーの値が含まれている可能性がある場合-使用

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