不知道Map键名时如何修改其所有值(Spigot插件开发场景)
解决方案
通用Map全值修改方法(无需获知键名)
Java针对Map结构提供了不需要提前知道键名即可批量修改所有值的原生能力,有两种常用实现方式:
- 方法1:
Map.replaceAll()(Java 8及以上版本推荐,代码最简洁)
直接传入转换函数即可对所有值做批量修改,示例代码:// 直接对附魔Map所有等级做ceil(lvl*1.2)转换 enchantMap.replaceAll((enchantKey, oldLevel) -> (int) Math.ceil(oldLevel * 1.2)); - 方法2:遍历
EntrySet修改(兼容低版本Java)
遍历Map的键值对集合,直接修改每个entry的值,同步作用到原Map:for (Map.Entry<Enchantment, Integer> entry : enchantMap.entrySet()) { int newLevel = (int) Math.ceil(entry.getValue() * 1.2); entry.setValue(newLevel); }
Spigot场景完整落地代码
结合你的附魔定时增强需求,完整的定时任务逻辑如下:
// 定时任务内部执行逻辑 for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { PlayerInventory inventory = onlinePlayer.getInventory(); // 遍历背包所有物品 for (ItemStack item : inventory.getContents()) { // 跳过空物品和无Meta的物品 if (item == null || !item.hasItemMeta()) { continue; } ItemMeta itemMeta = item.getItemMeta(); Map<Enchantment, Integer> enchantMap = itemMeta.getEnchants(); if (enchantMap.isEmpty()) { continue; } // 批量修改所有附魔等级,不需要获知具体附魔键名 enchantMap.replaceAll((enchant, oldLvl) -> (int) Math.ceil(oldLvl * 1.2)); // 将新的附魔应用到物品 for (Enchantment enchant : enchantMap.keySet()) { itemMeta.removeEnchant(enchant); // 最后一个参数设为true可突破原版附魔等级限制 itemMeta.addEnchant(enchant, enchantMap.get(enchant), true); } item.setItemMeta(itemMeta); } // 同步更新玩家客户端背包显示 onlinePlayer.updateInventory(); }
提示:如果服务端使用的Java版本低于8,将上述代码中的
replaceAll部分替换为EntrySet遍历的写法即可,逻辑完全一致。
内容的提问来源于stack exchange,提问作者Korogue
相关产品推荐
相关产品推荐

