问题描述
.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
));