1. 概要

このチュートリアルでは、MapからStringへの変換およびその逆に焦点を当てます。

最初に、コアJavaメソッドを使用してこれらを実現する方法を確認し、その後、いくつかのサードパーティライブラリを使用します。

2. 基本的なマップの例

すべての例で、同じ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 のすべてのキーを繰り返し処理し、それぞれについて、結果の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ストリームを使用して、マップ文字列に変換します

ストリームを使用して変換を実行するには、最初に、使用可能なMapキーからストリームを作成する必要があります。

Second, we’re mapping each key to a human-readable String.

最後に、これらの値を結合します。便宜上、 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を使用してマップ文字列に変換します

Guava をプロジェクトに追加して、1行のコードで変換を実現する方法を見てみましょう。

<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を使用して、MapStringに変換します

Apache Commons を使用するには、最初に次の依存関係を追加しましょう。

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

The joining is very straightforward — we just need to call the StringUtils.join method:

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

特筆すべきは、ApacheCommonsで利用可能なdebugPrintメソッドです。 デバッグの目的で非常に役立ちます。

私たちが呼ぶとき:

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

the debug text will be written to the console:

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. ストリームを使用して文字列マップに変換します

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を使用してStringMapに変換します

上記のよりコンパクトなバージョンは、1行のプロセスで分割と変換を行うためにGuavaに依存することです。

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

9. 結論

In this article, we saw how to convert a Map to a String and the other way around using both core Java methods and third-party libraries.

これらすべての例の実装は、GitHubにあります。