Java 8:如何将字符串转换为Map<String,String>?

7

我有一个地图:

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?谁能帮我解决这个问题?

请查看flatMap的文档。 - Dani
3
你不能这样做,因为如果你用utilMap.put(",=",",=,=");替换utilMap.put("2","2");,那么最终结果会变成1=1,,==,=,=,3=3,4=4,5=5,而且这是无法逆转的。 - Andreas
如果我使用Map<Long, Long>,那么我就无法@Andreas。 - Phuong
1
@PhuongLinh 但是你的问题使用了 Map<String, String> - Andreas
@Andreas 我也可以灵活地切换到 HashMap<Long, Long> 形式。 - Phuong
这个回答解决了您的问题吗?将表示键值对的字符串转换为Map - Volo Myhal
4个回答

17

将字符串使用,分割为单独的映射项。然后按=分割它们以获取键和值。

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

注意:评论中Andreas@所指出的那样,这不是一种可靠的将Map和字符串相互转换的方式。

编辑:感谢Holger提供的建议。

使用s.split("=", 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}


1
逗号不是正则表达式的特殊字符,因此无需转义。 - Andreas
4
使用s.split("=", 2)可以确保数组永远不会大于两个元素。虽然我们无法修复含糊不清的=字符,但我们可以防止在存在多个=字符时丢失内容。 - Holger
如果出现 a=1,b= 这种情况,上述代码将抛出 NullPointerException,我们该如何解决空指针问题 Collectors.toMap(s -> s[0], s -> s[1]) - Jatinder
不是NullPointerException,它会抛出ArrayIndexOutOfBoundsException。 - Jatinder

1

这里有另一种选项,它将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}]

为什么不使用 x.replaceFirst("=.*", "")x.replaceFirst(".*=", "")?虽然与 x.substring(0, x.indexOf('='))x.substring(x.indexOf('=')+1) 相比仍然较重,但不会通过正则表达式来强制 replaceAll 的行为向 replaceFirst 行为倾斜。 - Holger

0
如果您想从字符串生成地图,可以使用以下方法:
Map<String, String> newMap = Stream.of(utilMapString.split("\\,"))
            .collect(Collectors.toMap(t -> t.toString().split("=")[0], t -> t.toString().split("=")[1]));

0
如果序列可能包含具有相同键的值-请使用
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));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接