Как сопоставить значения на карте в Java 8?

Скажем, у меня есть Map<String, Integer>. Есть ли простой способ получить от него Map<String, String>?

Легко, я имею в виду не так:

Map<String, String> mapped = new HashMap<>();
for(String key : originalMap.keySet()) {
    mapped.put(key, originalMap.get(key).toString());
}

Но скорее какой-то один вкладыш вроде:

Map<String, String> mapped = originalMap.mapValues(v -> v.toString());

Но, очевидно, нет метода mapValues.

Ответ 1

Вам необходимо записать записи и собрать их на новой карте:

Map<String, String> result = map.entrySet().stream()
                  .collect(Collectors.toMap(Entry::getKey, e -> String.valueOf(e.getValue()));

Ответ 2

Самый простой способ сделать это:

Map<String, Integer> map = new HashMap<>();
Map<String, String> mapped = map.entrySet().stream()
        .collect(Collectors.toMap(Map.Entry::getKey, entry -> String.valueOf(entry.getValue())));

Что вы здесь делаете:

  1. Получить Stream<Map.Entry<String, Integer>>
  2. Соберите результаты в полученной карте:
    1. Сопоставьте записи с их ключом.
    2. Сопоставьте записи с новыми значениями, включая String.valueOf.

Причина, по которой вы не можете сделать это в map.replaceAll, заключается в map.replaceAll, что интерфейс Map не предлагает такого, ближе всего вы можете добраться до этого map.replaceAll, но этот метод диктует, что тип должен оставаться неизменным.