1. 概述

本文将聚焦于如何在 Java 中实现 MapString 之间的相互转换。

我们会先介绍使用原生 Java API 的方式,然后再演示一些第三方库(如 Guava 和 Apache Commons)提供的便捷方法。

2. 示例用的 Map

在所有示例中,我们都使用同一个 Map 实例:

Map<Integer, String> wordsByKey = new HashMap<>();
wordsByKey.put(1, "one");
wordsByKey.put(2, "two");
wordsByKey.put(3, "three");
wordsByKey.put(4, "four");

3. 通过遍历将 Map 转换为 String

我们可以遍历 Map 中的所有键,并将每个键值对拼接到一个 StringBuilder 对象中。

为了格式统一,我们可以在结果前后加上花括号 {}

public String convertWithIteration(Map<Integer, ?> map) {
    StringBuilder mapAsString = new StringBuilder("{");
    for (Integer key : map.keySet()) {
        mapAsString.append(key + "=" + map.get(key) + ", ");
    }
    mapAsString.delete(mapAsString.length()-2, mapAsString.length()).append("}");
    return mapAsString.toString();
}

✅ 验证转换结果的测试如下:

@Test
public void givenMap_WhenUsingIteration_ThenResultingStringIsCorrect() {
    String mapAsString = MapToString.convertWithIteration(wordsByKey);
    Assert.assertEquals("{1=one, 2=two, 3=three, 4=four}", mapAsString);
}

4. 使用 Java Streams 将 Map 转换为 String

使用 Java 8 的 Stream API,我们可以更优雅地完成这个任务:

public String convertWithStream(Map<Integer, ?> map) {
    String mapAsString = map.keySet().stream()
      .map(key -> key + "=" + map.get(key))
      .collect(Collectors.joining(", ", "{", "}"));
    return mapAsString;
}

⚠️ 注意:Collectors.joining() 方法支持自定义前缀、后缀和分隔符,非常适合格式化输出。

5. 使用 Guava 将 Map 转换为 String

引入 Guava 依赖:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

使用 Joiner 类可以简单粗暴地一行搞定转换:

public String convertWithGuava(Map<Integer, ?> map) {
    return Joiner.on(",").withKeyValueSeparator("=").join(map);
}

6. 使用 Apache Commons 将 Map 转换为 String

添加 Apache Commons Collections 依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.2</version>
</dependency>

使用 StringUtils.join() 方法实现转换:

public String convertWithApache(Map map) {
    return StringUtils.join(map);
}

另外,Apache Commons 提供的 MapUtils.debugPrint() 方法非常适合调试时使用:

MapUtils.debugPrint(System.out, "Map as String", wordsByKey);

输出如下:

Map as String = 
{
    1 = one java.lang.String
    2 = two java.lang.String
    3 = three java.lang.String
    4 = four java.lang.String
} java.util.HashMap

7. 使用 Streams 将 String 转换为 Map

将字符串解析为 Map 时,需要指定分隔符和键值对的拆分方式:

public Map<String, String> convertWithStream(String mapAsString) {
    Map<String, String> map = Arrays.stream(mapAsString.split(","))
      .map(entry -> entry.split("="))
      .collect(Collectors.toMap(entry -> entry[0], entry -> entry[1]));
    return map;
}

⚠️ 注意:该方法假设格式严格,实际使用时建议做异常处理。

8. 使用 Guava 将 String 转换为 Map

Guava 的 Splitter 类提供了一行代码搞定的方案:

public Map<String, String> convertWithGuava(String mapAsString) {
    return Splitter.on(',').withKeyValueSeparator('=').split(mapAsString);
}

✅ 简洁高效,适合快速开发。

9. 总结

本文介绍了多种在 Java 中实现 MapString 相互转换的方式,包括原生 Java API 和第三方库(Guava、Apache Commons)的支持。

你可以根据项目实际情况选择合适的方式。如果不想引入额外依赖,Stream API 是个不错的选择;如果追求简洁性,Guava 是首选。

所有示例代码均可在 GitHub 上找到。


原始标题:Map to String Conversion in Java