1. 概述
本文将聚焦于如何在 Java 中实现 Map
与 String
之间的相互转换。
我们会先介绍使用原生 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 中实现 Map
与 String
相互转换的方式,包括原生 Java API 和第三方库(Guava、Apache Commons)的支持。
你可以根据项目实际情况选择合适的方式。如果不想引入额外依赖,Stream API 是个不错的选择;如果追求简洁性,Guava 是首选。
所有示例代码均可在 GitHub 上找到。