如何根据相应的值更改Map键?

xmq68pz9  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(335)
.forEach((k,v) -> {v != 1 ? k=k + "s" : k=k;})

我想为一个元素的每个元素执行一个操作 Map<String, Double> . 如果值不是1,则在键后面附加字母“s”。如果值为1,则不执行任何操作(或仅为键指定键)。因此,当值不是1并且键是“car”时,附加“s”(“cars”)。
但我得到了一个错误:
不兼容类型:lambda表达式中的参数类型不兼容
我对lambda表达式有什么错?

ztmd8pv5

ztmd8pv51#

正如@applet123的注解中提到的,您不能修改Map中的现有键,应该替换它(删除现有键并放置新键)。
但是,代码如下:

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

将抛出 ConcurrentModificationException .
因此,应使用新Map:

Map<String, Double> 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
                    ));

相关问题