J'utilise un Runnable pour soustraire automatiquement 20 du temps de recharge d'un joueur à chaque seconde, mais je ne sais pas comment remplacer la valeur d'une valeur pendant que je l'itère. Comment puis-je lui faire mettre à jour la valeur de chaque clé?
public class CoolDownTimer implements Runnable {
@Override
public void run() {
for (Long l : playerCooldowns.values()) {
l = l - 20;
playerCooldowns.put(Key???, l);
}
}
}
Utilisation de Java 8:
map.replaceAll((k, v) -> v - 20);
Utilisation de Java 7 ou plus ancien:
Vous pouvez parcourir les entrées et mettre à jour les valeurs comme suit:
for (Map.Entry<Key, Long> entry : playerCooldowns.entrySet()) {
entry.setValue(entry.getValue() - 20);
}
Eh bien, vous ne pouvez pas le faire en itérant sur l'ensemble des valeurs dans Map
(comme vous le faites maintenant), car si vous faites cela, vous n'avez aucune référence aux clés, et si vous n'avez pas référence aux clés, vous ne pouvez pas mettre à jour les entrées de la carte, car vous n'avez aucun moyen de savoir quelle clé a été associée à la valeur que vous venez de mettre à jour.
Lorsque vous travaillez avec Maps, vous avez deux options pour les mises à jour comme celle-ci, parcourez chaque Map.Entry<K,V>
dans le Map
, ou vous pouvez parcourir la clé Set
. Il existe des méthodes sur Map
pour effectuer ces deux opérations. Personnellement, je voudrais parcourir chaque Map.Entry<K,V>
.
for (Map.Entry<String, Long> entry : playerCooldowns.entrySet()) {
entry.setValue(entry.getValue() - 20);
}
Pourquoi ne pas parcourir les objets Map.Entry ? Chaque Entry
vous donnera la clé et la valeur et vous n'avez pas besoin d'effectuer une get()
supplémentaire sur le Map
pour obtenir une valeur.