微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。