70

我正在使用 Runnable 每秒自动从玩家的冷却时间中减去 20,但我不知道如何在迭代时替换值的值。我怎样才能让它更新每个键的值?

public class CoolDownTimer implements Runnable {
    @Override
    public void run() {
        for (Long l : playerCooldowns.values()) {
            l = l - 20;
            playerCooldowns.put(Key???, l);
        }
    }

}
4

3 回答 3

126

使用 Java 8:

map.replaceAll((k, v) -> v - 20);

使用 Java 7 或更早版本:

您可以遍历条目并更新值,如下所示:

for (Map.Entry<Key, Long> entry : playerCooldowns.entrySet()) {
    entry.setValue(entry.getValue() - 20);
}
于 2012-06-12T09:01:53.257 回答
27

好吧,你不能通过迭代中的一组值来做到这一点Map(就像你现在所做的那样),因为如果你这样做,那么你就没有对键的引用,如果你没有对键的引用,那么您无法更新地图中的条目,因为您无法找出与刚刚更新的值相关联的键。

使用 Maps 时,您有两个这样的更新选项,遍历Map.Entry<K,V>中的每个Map,或者您可以遍历 key Set。有一些方法Map可以做这两件事。就个人而言,我会遍历每个Map.Entry<K,V>.

for (Map.Entry<String, Long> entry : playerCooldowns.entrySet()) {
    entry.setValue(entry.getValue() - 20);
}
于 2012-06-12T09:07:59.327 回答
11

为什么不遍历Map.Entry对象?每个都Entry将为您提供键和值,您无需执行额外get()的操作Map即可获得值。

于 2012-06-12T09:00:37.853 回答