Ответ, который я получаю: {2 = PQR, 4 = RST}, но мой ответ должен быть следующим: {2 = PQR1, 4 = RST1}
Строки являются неизменяемыми, Вы не устанавливаете новое значение для записи. Вы должны сделать новую запись и затем собрать ее в Map
:
.map(m2 -> new AbstractMap.SimpleEntry<>(m2.getKey(), m2.getValue().replace("PQR","PQR1")))
... или с помощью простого Map::setValue
.
Однако, есть гораздо лучше путь. По сути, вы хотите:
- Отфильтровать эти записи, имеющие определенный
value
. - Изменить эти значения
Stream API предназначен скорее для работы однако с Collection
s, чем Map
s, они все равно создаются в коллекции. Есть способ, немного неуклюжий, но это:
Map<String, String> helpMap = new HashMap<>(); // the replacement map
helpMap.put("PQR", "PQR1");
helpMap.put("RST", "RST1");
Map<Integer, String> newMap = m.entrySet().stream()
.filter(map -> map.getKey().intValue() %2 == 0) // only qualified keys
.map(entry -> new AbstractMap.SimpleEntry<>(
entry.getKey(), // key -> key
replacementMap.getOrDefault( // lookup the value in helpMap
entry.getValue(), // ... by the value as key
entry.getValue()))) // ... or keep the original value
.collect(Collectors.toMap( // collect back to Map<Integer,String>
Map.Entry::getKey, // ... keys
Map.Entry::getValue)); // ... values
Примечания:
- Решение основано на сопоставлении записей каждой новой
Map.Entry
с измененными значениями , из которого легко завершить новый Map
, используя правильный коллектор. - Если значение для замены не найдено в
helpMap
, то используется исходное значение - это ваше дело. Вы можете отфильтровать эти недопустимые значения, используя .filter(entry -> replacementMap.containsKey(entry.getValue()))
перед .map(..)
.