1. Обзор
В этом уроке мы сосредоточимся на преобразовании из Map в String и наоборот.
Во-первых, мы посмотрим, как достичь этого с помощью основных методов Java, а затем мы будем использовать некоторые сторонние библиотеки.
2. Пример базовой карты
Во всех примерах мы будем использовать одну и ту же реализацию Map :
MapwordsByKey = new HashMap<>(); wordsByKey.put(1, "one"); wordsByKey.put(2, "two"); wordsByKey.put(3, "three"); wordsByKey.put(4, "four");
3. Преобразуйте карту в строку путем итерации
Давайте переберем все ключи в нашей карте и для каждого из них добавим комбинацию ключ-значение к нашему результирующему объекту StringBuilder |.
Для целей форматирования мы можем заключить результат в фигурные скобки:
public String convertWithIteration(Mapmap) { 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(Mapmap) { String mapAsString = map.keySet().stream() .map(key -> key + "=" + map.get(key)) .collect(Collectors.joining(", ", "{", "}")); return mapAsString; }
5. Преобразуйте карту в строку с помощью Guava
Давайте добавим Guava в наш проект и посмотрим, как мы можем добиться преобразования в одной строке кода:
com.google.guava guava 27.0.1-jre
Чтобы выполнить преобразование с помощью класса Joiner Guava, нам нужно определить разделитель между различными записями Map и разделитель между ключами и значениями:
public String convertWithGuava(Mapmap) { return Joiner.on(",").withKeyValueSeparator("=").join(map); }
6. Преобразуйте карту в строку с помощью Apache Commons
Чтобы использовать Apache Commons , давайте сначала добавим следующую зависимость:
org.apache.commons commons-collections4 4.2
Соединение очень простое – нам просто нужно вызвать StringUtils.метод join :
public String convertWithApache(Map map) { return StringUtils.join(map); }
Одно особое упоминание относится к методу debug Print , доступному в 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 MapconvertWithStream(String mapAsString) { Map map = Arrays.stream(mapAsString.split(",")) .map(entry -> entry.split("=")) .collect(Collectors.toMap(entry -> entry[0], entry -> entry[1])); return map; }
8. Преобразуйте строку в карту с помощью Guava
Более компактная версия вышеизложенного состоит в том, чтобы полагаться на гуаву для разделения и преобразования для нас в однострочном процессе:
public MapconvertWithGuava(String mapAsString) { return Splitter.on(',').withKeyValueSeparator('=').split(mapAsString); }
9. Заключение
В этом уроке мы рассмотрели, как преобразовать Map в String и наоборот, используя как основные методы Java, так и сторонние библиотеки.
Реализацию всех этих примеров можно найти на GitHub .