From 7d523efd41b23c7321673fe7ae1740b0a6033b51 Mon Sep 17 00:00:00 2001 From: AnimeGitB Date: Fri, 19 Aug 2022 12:44:55 +0930 Subject: [PATCH] Avoid allocations on Map::putIfAbsent usage Map::computeIfAbsent only runs the passed constructors when it needs to --- src/main/java/emu/grasscutter/game/tower/TowerManager.java | 5 +++-- .../java/emu/grasscutter/game/world/WorldDataSystem.java | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/emu/grasscutter/game/tower/TowerManager.java b/src/main/java/emu/grasscutter/game/tower/TowerManager.java index 8da97358c..c562a54ab 100644 --- a/src/main/java/emu/grasscutter/game/tower/TowerManager.java +++ b/src/main/java/emu/grasscutter/game/tower/TowerManager.java @@ -106,8 +106,9 @@ public class TowerManager extends BasePlayerManager { if (!hasNextLevel()) { // set up the next floor - recordMap.putIfAbsent(getNextFloorId(), new TowerLevelRecord(getNextFloorId())); - player.getSession().send(new PacketTowerCurLevelRecordChangeNotify(getNextFloorId(), 1)); + var nextFloorId = this.getNextFloorId(); + recordMap.computeIfAbsent(nextFloorId, TowerLevelRecord::new); + player.getSession().send(new PacketTowerCurLevelRecordChangeNotify(nextFloorId, 1)); }else { player.getSession().send(new PacketTowerCurLevelRecordChangeNotify(currentFloorId, getCurrentLevel())); } diff --git a/src/main/java/emu/grasscutter/game/world/WorldDataSystem.java b/src/main/java/emu/grasscutter/game/world/WorldDataSystem.java index 4715434b0..5c0b404bd 100644 --- a/src/main/java/emu/grasscutter/game/world/WorldDataSystem.java +++ b/src/main/java/emu/grasscutter/game/world/WorldDataSystem.java @@ -42,7 +42,7 @@ public class WorldDataSystem extends BaseGameSystem { DataLoader.loadList("ChestReward.json", ChestReward.class) .forEach(reward -> reward.getObjNames().forEach(name -> - chestInteractHandlerMap.putIfAbsent(name, new NormalChestInteractHandler(reward)))); + chestInteractHandlerMap.computeIfAbsent(name, x -> new NormalChestInteractHandler(reward)))); } catch (Exception e) { Grasscutter.getLogger().error("Unable to load chest reward config.", e); }