Я искал короткий и легко читаемый метод удаления записей из хэш-карты. В частности, это мой метод:
Map<String, HashMap<String, Long>> kitcooldowns = new HashMap<String, HashMap<String, Long>>();
// METHOD TO REMOVE EXPIRED COOLDOWNS FROM HASHMAP
final long currentime = System.currentTimeMillis();
final HashMap<String, HashMap<String, Long>> tmp = new HashMap<String, HashMap<String,Long>>();
for (final Entry<String, HashMap<String, Long>> kits : kitcooldowns.entrySet()) {
final HashMap<String, Long> newitems = new HashMap<String, Long>();
for (final Entry<String, Long> item : kits.getValue().entrySet()) {
if (item.getValue() + getCooldownTime(item.getKey()) > currentime) {
newitems.put(item.getKey(), item.getValue());
}
}
if (newitems.isEmpty() == false) tmp.put(kits.getKey(), newitems);
}
kitcooldowns = tmp;
private long getCooldownTime(final String type) {
switch (type) {
case "CooldownX":
return 3600000;
case "CooldownY":
return 1800000;
default:
return 0L;
}
}
Чтобы упростить это, это основная структура:
MAP<NAME OF PLAYER, MAP<TYPE OF COOLDOWN, TIME WHEN USED>>
Если определенное время восстановления истекло, игрок удаляется из Hashmap. Мне это кажется запутанным решением, и я уверен, что есть лучшее.
РЕДАКТИРОВАТЬ: У меня вопрос, есть ли эффективный и чистый метод (например, итератор) с Java 8, в котором есть множество новых однострочных решений для большинства длинных методов.
2 ответа
Вы можете просто использовать этот однострочник Java:
final long currentime = System.currentTimeMillis();
kitcooldowns.entrySet().removeIf(entry -> entry.getValue().entrySet()
.removeIf(entry2 -> entry2.getValue() + getCooldownTime(entry2.getKey())
< currentime) && entry.getValue().isEmpty());
Не нужно создавать отдельную карту. Вы можете использовать Iterator#remove()
< / a>, если вы перебираете entrySet()
или values()
карты.
for (Iterator<Entry<String, Long>> iter = kitcooldowns.entrySet().iterator(); iter.hasNext();) {
Entry<String, Long> entry = iter.next();
if (entry.getValue() + getCooldownTime(entry.getKey()) > currentime) {
iter.remove();
}
}
ОП хочет знать:
Нет ли однострочного решения с Java 8?
Конечно, но Я настоятельно не рекомендую писать все однострочно только потому, что это возможно. Помните, что код существует для чтения будущих разработчиков, а не для максимально краткого написания. Более того, код, использующий Iterator#remove()
, будет использовать меньше памяти, потому что ему не нужно делать копию карты. Код, который использует меньше памяти, также может быть быстрее, потому что меньшее использование памяти приводит к меньшему количеству мусора (который требует времени процессора) и меньшему количеству промахов в кэше процессора.
При этом сказано:
kitcooldowns = kitcooldowns.entrySet().stream()
.filter(entry -> entry.getValue() + getCooldownTime(entry.getKey()) <= currentime)
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.