【问题标题】:How to change map keys based on the corresponding values?如何根据相应的值更改地图键?
【发布时间】:2021-04-08 08:16:45
【问题描述】:
.forEach((k,v) -> {v != 1 ? k=k + "s" : k=k;})

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

但我得到了错误:

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

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

【问题讨论】:

  • 应该使用 if/else 语句而不是三元运算符,或者将其重构为 k = v != 1 ? k + "s" : k。无论如何,这不会做任何事情,因为您不能改变 Map 上的键。我也没有收到您声称的错误。如果要编辑键,请创建一个新地图并将元素附加到该地图。
  • 您显示的短 sn-p 甚至无法编译。而且您显示的错误不是原因。您能否提供足够的代码以可靠地实际重现该示例?

标签: java dictionary lambda foreach


【解决方案1】:

正如@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
                    ));

【讨论】:

  • @LiveandLetLive,感谢您的支持,但是,我认为取消删除这个重复问题的机会非常渺茫 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
  • 1970-01-01
  • 2017-11-02
  • 2014-09-21
相关资源
最近更新 更多