我使用一个 Runnable 来自动减去玩家冷却时间每秒20,但我不知道如何替换一个值,因为我迭代通过它的价值。如何让它更新每个键的值?
public class CoolDownTimer implements Runnable { @Override public void run() { for (Long l : playerCooldowns.values()) { l = l - 20; playerCooldowns.put(Key???, l); } } }
为什么不在 地图,入口对象上迭代?每个 Entry都会提供键和值,您不必在 Map上执行额外的 get()来获得值。
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>。
Map.Entry<K,V>
Set
for (Map.Entry<String, Long> entry : playerCooldowns.entrySet()) { entry.setValue(entry.getValue() - 20); }