.forEach((k,v) -> {v != 1 ? k=k + "s" : k=k;})

Я хочу выполнить действие для каждого элемента Map. Если значение не равно 1, то добавить к ключу букву "s". Если значение равно 1, то ничего не делать (или присвоить ключу только ключ). Таким образом, если значение не равно 1, а ключ - "Car", добавьте букву "s" ("Cars").

Но я получаю ошибку:

несовместимые типы: несовместимые типы параметров в лямбда-выражении

Что я делаю неправильно с лямбда-выражениями?

Aaron

Ответы (1)

Как упоминалось в комментарии @Applet123, вы не можете изменить существующий ключ в карте, вместо этого вы должны заменить его (удалить существующий ключ и вставить новый).

Как бы то ни было, код выглядит следующим образом:

map.forEach((k, v) -> { if (v > 1) {map.remove(k); map.put(k + "s", v); }} );

выбросит ConcurrentModificationException.

Так что следует использовать новую карту:

Map copy = new HashMap<>();
map.forEach((k, v) -> copy.put( v > 1 ? k + "s" : k, v) );

Или можно собрать в новую карту, используя Collectors.toMap:

map = map.entrySet().stream()
                    .collect(Collectors.toMap(
                        e -> e.getValue() > 1 ? e.getKey() + "s" : e.getKey(), 
                        Map.Entry::getValue,
                        (v1, v2) -> v1 > v2 ? v1 : v2  // resolve possible conflicts
                        //, LinkedHashMap::new // optional argument to keep the order insertion for keys
                    ));

2022 WebDevInsider