Перейти к основному содержимому

Преобразование Map в String в Java

· 3 мин. чтения

Задача: Сумма двух

Дано массив целых чисел и целая сумма. Нужно найти индексы двух чисел, сумма которых равна заданной ...

ANDROMEDA

1. Обзор

В этом руководстве мы сосредоточимся на преобразовании карты в строку и наоборот.

Сначала мы увидим, как добиться этого с помощью основных методов 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. Преобразование карты в строку путем итерации

Давайте переберем все ключи в нашей карте и для каждого из них добавим комбинацию ключ-значение к нашему результирующему объекту 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 .

Чтобы выполнить преобразование с использованием потоков, нам сначала нужно создать поток из доступных ключей 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 в наш проект и посмотрим, как мы можем добиться преобразования в одной строке кода:

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

Чтобы выполнить преобразование с использованием класса Joiner в Guava , нам нужно определить разделитель между различными записями карты и разделитель между ключами и значениями:

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

6. Преобразование карты в строку с помощью Apache Commons

Чтобы использовать 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);
}

Отдельного упоминания заслуживает метод debugPrint , доступный в Apache Commons. Это очень полезно для целей отладки.

Когда мы звоним:

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. Преобразование строки в карту с использованием потоков

Чтобы выполнить преобразование из 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, который выполняет разделение и преобразование для нас в однострочном процессе:

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

9. Заключение

В этой статье мы увидели, как преобразовать карту в строку и наоборот, используя как основные методы Java, так и сторонние библиотеки.

Реализацию всех этих примеров можно найти на GitHub .