在Map中为术语添加值

Ric*_*ler 6 java java-8

我正在尝试将特定值添加到地图中Java,其中键非常复杂,但值是一个简单的Double.

目前我正在使用,其中foos是一个实例java.util.TreeMap<Foo, Double>,并且amount是一个Double代码,如:

for (java.util.Map.Entry<Foo, Double> entry : foos.entrySet()){     
    foos.put(entry.getKey(), entry.getValue() + amount);    
}   
Run Code Online (Sandbox Code Playgroud)

但这看起来很脏,我必须重新插入元素,我担心使迭代器失效.

有没有更好的方法呢?我正在使用最新版本的Java.

Ale*_* C. 9

由于您只想修改值,因此可以使用Map#replaceAll:

foos.replaceAll((k, v) -> v + amount);
Run Code Online (Sandbox Code Playgroud)

merge 如果你可能有新的键要插入,这是很有用的,但这不是你的情况,因为你在迭代同一组键.


Bat*_*eba 6

一种方法是使用Map#merge它,因为Java版本8,已经可用:

for (java.util.Map.Entry<Foo, Double> entry : foos.entrySet()){ 
    foos.merge(entry.getKey(), amount, Double::sum);    
}      
Run Code Online (Sandbox Code Playgroud)

注意使用方法引用符号::,不要与C++ 的范围解析运算符混淆.

在这里,我使用"罐头"功能,Double::sum但你可以有很多乐趣构建自己的功能,这使得这种方法特别强大.有关详细信息,请参阅https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#merge-KV-java.util.function.BiFunction-