如何替换 HashMap 值,同时在 Java 中迭代它们

我使用一个 Runnable 来自动减去玩家冷却时间每秒20,但我不知道如何替换一个值,因为我迭代通过它的价值。如何让它更新每个键的值?

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


}
90213 次浏览

为什么不在 地图,入口对象上迭代?每个 Entry都会提供键和值,您不必在 Map上执行额外的 get()来获得值。

使用 Java8:

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

使用 Java7或以上版本:

您可以对条目进行迭代,并按如下方式更新值:

for (Map.Entry<Key, Long> entry : playerCooldowns.entrySet()) {
entry.setValue(entry.getValue() - 20);
}

好吧,你不能通过遍历 Map中的值集来做到这一点(正如你现在所做的) ,因为如果你这样做了,那么你就没有对键的引用,如果你没有对键的引用,那么你就不能更新映射中的条目,因为你没有办法找出哪个键与你刚刚更新的值相关联。

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

for (Map.Entry<String, Long> entry : playerCooldowns.entrySet()) {
entry.setValue(entry.getValue() - 20);
}