Сравнить (а)
map.keySet().parallelStream().forEach(key -> {
if (key == 3) {
map.put(3, 0);
}
});
(добавлена новая запись)
с (б)
map.entrySet().parallelStream().forEach(e -> {
if (e.getKey() == 3) {
e.setValue(0);
}
});
(объект Entry не создан, перемещен. Но остерегайтесь LinkedHashMap
.)
- (a) Небезопасный
(b) Безопасный
Всегда ли выход кода равен ([1,1], [2,2], [3,0], [4,4])?
(a)нет (б) да
Может ли map.put(3, 0)
рассматриваться как не мешающая операция?
(а) нет (б) setValue(0)
да
Можно ли считать map.put(3, 0)
приемлемым побочным эффектом?
(a) нет (b) setValue(0)
да
Так (а) это зло и (б) все в порядке.
Почему упоминание entrySet.setValue?
На самом деле HashMap.put
в реализации Oracle 1056 *, вероятно, делает то же самое, что и Entry.setValue
.Это потребует использования знаний о реализации - безобразно.
Принимая во внимание, что Entry.setValue основан на поддержке исходной карты, и можно заключить, что только поле значения перезаписывается.Обратите внимание, что LinkedHashMap
необходимо изменить порядок записи, и это изменение порядка снова небезопасно.