From 7d523efd41b23c7321673fe7ae1740b0a6033b51 Mon Sep 17 00:00:00 2001
From: AnimeGitB <AnimeGitB@bigblueball.in>
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 8da97358..c562a54a 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 4715434b..5c0b404b 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);
         }
-- 
GitLab