Java中Map到字符串的转换

2023/06/07

1. 概述

在本教程中,我们将重点介绍从Map到String的转换以及相反的转换。

首先,我们将了解如何使用核心Java方法实现这些,然后,我们将使用一些第三方库。

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

要检查我们是否正确转换了Map,让我们运行以下测试:

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

4. 使用Java Stream将Map转换为字符串

要使用Stream执行转换,我们首先需要从可用的Map键中创建一个流。

其次,我们将每个键映射到人类可读的字符串。

最后,我们拼接这些值,为了方便起见,我们使用Collectors.joining()方法添加一些格式化规则:

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

5. 使用Guava将Map转换为字符串

让我们将Guava添加到我们的项目中,看看我们如何在一行代码中实现转换:

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

要使用Guava的Joiner类执行转换,我们需要定义不同Map条目之间的分隔符以及键和值之间的分隔符:

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

6. 使用Apache Commons将Map转换为字符串

要使用Apache Commons,让我们先添加以下依赖项:

<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中可用的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. 使用Stream将字符串转换为Map

要执行从String到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将字符串转换为Map

以上方法更紧凑的版本是依靠Guava在一行中为我们做拆分和转换:

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

9. 总结

在本文中,我们了解了如何使用核心Java方法和第三方库将Map转换为String,反之亦然。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章