【问题标题】:Java 8: How to convert String to Map<String,String>?Java 8:如何将 String 转换为 Map<String,String>?
【发布时间】:2018-10-08 04:31:23
【问题描述】:

我有一张地图:

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 的文档。
  • 你不能,因为如果你用utilMap.put(",=",",=,=");替换utilMap.put("2","2");,那么你最终会得到1=1,,==,=,=,3=3,4=4,5=5,这是不可逆的。
  • 如果我使用地图 那么我不能@Andreas
  • @PhuongLinh 但你的问题是使用Map&lt;String, String&gt;
  • @Andreas 我也可以灵活切换到HashMap 形式

标签: java lambda java-8 java-stream


【解决方案1】:

将字符串按, 拆分以获取单独的地图条目。然后用=拆分得到key和value。

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

注意:正如Andreas@ in the comments 所指出的,这不是在地图和字符串之间进行转换的可靠方法

编辑: 感谢 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}

【讨论】:

  • 逗号不是正则表达式特殊字符,所以不需要转义。
  • 使用s.split("=", 2) 确保数组永远不会大于两个元素。虽然我们无法修复模棱两可的 = 字符,但我们可以防止内容过多时丢失。
【解决方案2】:

这是另一个选项,它将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 的行为。
【解决方案3】:

如果你想从 String 生成地图,你可以通过以下方式:

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

【讨论】:

    【解决方案4】:

    如果序列可能包含具有相同键的值 - 使用

    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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多