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

问题描述

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

我想对 Map<String,Double> 的每个元素执行一个操作。如果该值不是 1,则将字母“s”附加到键。如果值为 1,则不执行任何操作(或仅将键分配给键)。所以当值不是 1 并且键是“Car”时,附加“s”(“Cars”)。

但我收到错误

incompatible types: lambda 表达式中不兼容的参数类型

我对 lambda 表达式做错了什么?

解决方法

正如@Applet123 的评论中提到的,您不能修改地图中的现有键,您应该替换它(删除现有键并放置新键)。

但是,代码是这样的:

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

会抛出 ConcurrentModificationException

所以应该使用新地图:

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
                    ));