在Map中为术语添加值

时间:2017-02-01 12:58:35

标签: java java-8

我试图在Java中向地图添加特定值,其中键非常复杂,但值是一个简单的Double。

目前我正在使用,其中foos是java.util.TreeMap<Foo, Double>的实例,而amountDouble,代码如下:

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

但是这看起来很脏,因为我必须重新插入元素,并且我担心使迭代器失效。

有更好的方法吗?我使用的是最新版本的Java。

3 个答案:

答案 0 :(得分:9)

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

DB: Steam_users
tables: id, steamid, name, avatar, credits
如果你可能有新的键要插入,那么

print $_SESSION['user']['credits']; 很有用,但由于你在同一组键上进行迭代,所以不是你的情况。

答案 1 :(得分:6)

一种方法是使用自{8}以来可用的Map#merge

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

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

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

答案 2 :(得分:4)

您只需使用entry.setValue即可。文档说:

  

使用指定值替换此条目对应的值(可选操作)。 (写到地图上。)

所以:

for (java.util.Map.Entry<Foo, Double> entry : foos.entrySet()){     
    entry.setValue(entry.getValue() + amount));
}