.forEach((k,v) -> {v != 1 ? k=k + "s" : k=k;})
我想为一个元素的每个元素执行一个操作 Map<String, Double> . 如果值不是1,则在键后面附加字母“s”。如果值为1,则不执行任何操作(或仅为键指定键)。因此,当值不是1并且键是“car”时,附加“s”(“cars”)。但我得到了一个错误:不兼容类型:lambda表达式中的参数类型不兼容我对lambda表达式有什么错?
Map<String, Double>
ztmd8pv51#
正如@applet123的注解中提到的,您不能修改Map中的现有键,应该替换它(删除现有键并放置新键)。但是,代码如下:
map.forEach((k, v) -> { if (v > 1) {map.remove(k); map.put(k + "s", v); }} );
将抛出 ConcurrentModificationException .因此,应使用新Map:
ConcurrentModificationException
Map<String, Double> copy = new HashMap<>(); map.forEach((k, v) -> copy.put( v > 1 ? k + "s" : k, v) );
或者可以使用 Collectors.toMap :
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 ));
1条答案
按热度按时间ztmd8pv51#
正如@applet123的注解中提到的,您不能修改Map中的现有键,应该替换它(删除现有键并放置新键)。
但是,代码如下:
将抛出
ConcurrentModificationException
.因此,应使用新Map:
或者可以使用
Collectors.toMap
: