From 41e3b0a5bd82ff79a3fb4be96132cdcbacd9d1fe Mon Sep 17 00:00:00 2001 From: Maxence Simon <32517160+Maxlego08@users.noreply.github.com> Date: Sun, 19 Oct 2025 16:14:20 +0200 Subject: [PATCH 1/4] Replace stream usage with loops --- .../fr/maxlego08/menu/api/button/Button.java | 11 ++- .../menu/api/button/PermissibleButton.java | 14 ++- .../menu/api/button/PlaceholderButton.java | 7 +- .../api/checker/InventoryLoadRequirement.java | 7 +- .../menu/api/configuration/Config.java | 29 +++--- .../menu/api/enums/PlaceholderAction.java | 7 +- .../menu/api/requirement/Action.java | 12 ++- .../menu/api/requirement/ConditionalName.java | 7 +- .../menu/api/utils/Placeholders.java | 8 +- .../menu/api/utils/cuboid/Cuboid.java | 17 +++- .../menu/api/utils/cuboid/Region.java | 14 ++- .../maxlego08/menu/hooks/ComponentMeta.java | 23 +++-- .../hooks/dialogs/AbstractDialogManager.java | 27 +++--- .../menu/hooks/dialogs/ZDialogManager.java | 46 ++++++---- .../menu/placeholder/LocalPlaceholder.java | 20 ++-- .../fr/maxlego08/menu/ZButtonManager.java | 91 +++++++++++++------ src/main/java/fr/maxlego08/menu/ZCommand.java | 8 +- .../fr/maxlego08/menu/ZCommandManager.java | 28 +++++- .../java/fr/maxlego08/menu/ZInventory.java | 84 +++++++++++++---- .../fr/maxlego08/menu/ZInventoryManager.java | 89 ++++++++++++++---- .../fr/maxlego08/menu/ZMenuItemStack.java | 22 ++++- .../menu/command/VCommandManager.java | 21 ++++- .../commands/CommandMenuGiveOpenItem.java | 11 ++- .../command/commands/CommandMenuOpen.java | 11 ++- .../commands/dialogs/CommandDialogOpen.java | 10 +- .../players/CommandMenuPlayersKeys.java | 9 +- .../reload/CommandMenuReloadCommand.java | 11 ++- .../reload/CommandMenuReloadInventory.java | 11 ++- .../menu/enchantment/ZEnchantments.java | 16 +++- .../maxlego08/menu/loader/CommandLoader.java | 19 ++-- .../menu/loader/InventoryLoader.java | 29 ++++-- .../menu/loader/MenuItemStackLoader.java | 17 +++- .../maxlego08/menu/loader/ZButtonLoader.java | 42 +++++++-- .../deluxemenu/ButtonDeluxeMenuLoader.java | 14 ++- .../deluxemenu/InventoryDeluxeMenuLoader.java | 8 +- .../permissible/CuboidPermissibleLoader.java | 7 +- .../maxlego08/menu/players/ZDataManager.java | 13 ++- .../players/inventory/ZInventoriesPlayer.java | 33 ++++--- .../players/inventory/ZInventoryPlayer.java | 19 ++-- .../menu/requirement/ZRefreshRequirement.java | 14 ++- .../menu/requirement/ZRequirement.java | 18 ++-- .../requirement/actions/BroadcastAction.java | 11 ++- .../menu/storage/ZStorageManager.java | 17 ++-- .../menu/website/ZWebsiteManager.java | 38 ++++++-- .../maxlego08/menu/zcore/utils/PapiUtils.java | 8 +- .../fr/maxlego08/menu/zcore/utils/ZUtils.java | 20 +++- .../utils/itemstack/MenuItemStackFormMap.java | 7 +- .../zcore/utils/loader/ItemStackLoader.java | 7 +- .../menu/zcore/utils/nms/NmsVersion.java | 11 ++- 49 files changed, 751 insertions(+), 272 deletions(-) diff --git a/API/src/main/java/fr/maxlego08/menu/api/button/Button.java b/API/src/main/java/fr/maxlego08/menu/api/button/Button.java index 40defcd9..198c7c88 100644 --- a/API/src/main/java/fr/maxlego08/menu/api/button/Button.java +++ b/API/src/main/java/fr/maxlego08/menu/api/button/Button.java @@ -144,12 +144,15 @@ public void onRender(Player player, InventoryEngine inventoryEngine) { int inventorySize = this.isPlayerInventory() ? 36 : inventoryEngine.getInventory().getSize(); - int[] slots = this.getSlots().stream().map(slot -> { + List slotList = new ArrayList<>(this.getSlots()); + int[] slots = new int[slotList.size()]; + for (int i = 0; i < slotList.size(); i++) { + int slot = slotList.get(i); if (!this.isPermanent) { - return slot - ((this.getPage() - 1) * inventorySize); + slot -= ((this.getPage() - 1) * inventorySize); } - return slot; - }).mapToInt(Integer::intValue).toArray(); + slots[i] = slot; + } inventoryEngine.displayFinalButton(this, slots); } } diff --git a/API/src/main/java/fr/maxlego08/menu/api/button/PermissibleButton.java b/API/src/main/java/fr/maxlego08/menu/api/button/PermissibleButton.java index f397e149..598556a5 100644 --- a/API/src/main/java/fr/maxlego08/menu/api/button/PermissibleButton.java +++ b/API/src/main/java/fr/maxlego08/menu/api/button/PermissibleButton.java @@ -34,11 +34,21 @@ public boolean hasElseButton() { public boolean checkPermission(Player player, InventoryEngine inventoryEngine, Placeholders placeholders) { if (!this.orPermissions.isEmpty()) { - return this.orPermissions.stream().anyMatch(p -> p.hasPermission(player, null, inventoryEngine, placeholders)); + for (PermissionPermissible permission : this.orPermissions) { + if (permission.hasPermission(player, null, inventoryEngine, placeholders)) { + return true; + } + } + return false; } if (!this.permissions.isEmpty()) { - return this.permissions.stream().allMatch(p -> p.hasPermission(player, null, inventoryEngine, placeholders)); + for (PermissionPermissible permission : this.permissions) { + if (!permission.hasPermission(player, null, inventoryEngine, placeholders)) { + return false; + } + } + return true; } return true; diff --git a/API/src/main/java/fr/maxlego08/menu/api/button/PlaceholderButton.java b/API/src/main/java/fr/maxlego08/menu/api/button/PlaceholderButton.java index 177549d2..543839f4 100644 --- a/API/src/main/java/fr/maxlego08/menu/api/button/PlaceholderButton.java +++ b/API/src/main/java/fr/maxlego08/menu/api/button/PlaceholderButton.java @@ -37,6 +37,11 @@ public boolean checkPermission(Player player, InventoryEngine inventoryEngine, P } // Then we will check if the player to all valid placeholders - return this.placeholders.stream().allMatch(placeholder -> placeholder.hasPermission(player, null, inventoryEngine, placeholders)); + for (PlaceholderPermissible placeholder : this.placeholders) { + if (!placeholder.hasPermission(player, null, inventoryEngine, placeholders)) { + return false; + } + } + return true; } } diff --git a/API/src/main/java/fr/maxlego08/menu/api/checker/InventoryLoadRequirement.java b/API/src/main/java/fr/maxlego08/menu/api/checker/InventoryLoadRequirement.java index f9b67ead..4adb2062 100644 --- a/API/src/main/java/fr/maxlego08/menu/api/checker/InventoryLoadRequirement.java +++ b/API/src/main/java/fr/maxlego08/menu/api/checker/InventoryLoadRequirement.java @@ -53,7 +53,12 @@ public void removeRequirement(InventoryRequirementType inventoryRequirementType, } public boolean canLoad() { - return this.requirements.values().stream().allMatch(List::isEmpty); + for (List names : this.requirements.values()) { + if (!names.isEmpty()) { + return false; + } + } + return true; } public Map> getRequirements() { diff --git a/API/src/main/java/fr/maxlego08/menu/api/configuration/Config.java b/API/src/main/java/fr/maxlego08/menu/api/configuration/Config.java index 88b9b6ba..9ffc70fd 100644 --- a/API/src/main/java/fr/maxlego08/menu/api/configuration/Config.java +++ b/API/src/main/java/fr/maxlego08/menu/api/configuration/Config.java @@ -14,7 +14,6 @@ import java.util.Arrays; import java.util.List; import java.util.Objects; -import java.util.stream.Collectors; @ConfigDialog( name = "zMenu Config", @@ -333,17 +332,16 @@ public void load(FileConfiguration configuration) { antiDupeDiscordWebhookUrl = configuration.getString(ConfigPath.ANTI_DUPE_DISCORD_WEBHOOK_URL.getPath()); antiDupeMessage = configuration.getString(ConfigPath.ANTI_DUPE_MESSAGE.getPath()); - allClicksType = configuration.getStringList(ConfigPath.ALL_CLICKS_TYPE.getPath()).stream() - .map(name -> { - try { - return ClickType.valueOf(name); - } catch (IllegalArgumentException e) { - Bukkit.getLogger().warning("[zMenu] Invalid click type in config: " + name); - return null; - } - }) - .filter(Objects::nonNull) - .collect(Collectors.toList()); + List clickTypeStrings = configuration.getStringList(ConfigPath.ALL_CLICKS_TYPE.getPath()); + List clickTypes = new ArrayList<>(clickTypeStrings.size()); + for (String name : clickTypeStrings) { + try { + clickTypes.add(ClickType.valueOf(name)); + } catch (IllegalArgumentException e) { + Bukkit.getLogger().warning("[zMenu] Invalid click type in config: " + name); + } + } + allClicksType = clickTypes; enableCacheItemStack = configuration.getBoolean(ConfigPath.ENABLE_CACHE_ITEM_STACK.getPath()); enableCooldownClick = configuration.getBoolean(ConfigPath.ENABLE_COOLDOWN_CLICK.getPath()); @@ -386,9 +384,10 @@ public void save(FileConfiguration configuration, File file) { configuration.set(ConfigPath.ANTI_DUPE_DISCORD_WEBHOOK_URL.getPath(), antiDupeDiscordWebhookUrl); configuration.set(ConfigPath.ANTI_DUPE_MESSAGE.getPath(), antiDupeMessage); - List clickTypeNames = allClicksType.stream() - .map(Enum::name) - .collect(Collectors.toList()); + List clickTypeNames = new ArrayList<>(allClicksType.size()); + for (ClickType clickType : allClicksType) { + clickTypeNames.add(clickType.name()); + } configuration.set(ConfigPath.ALL_CLICKS_TYPE.getPath(), clickTypeNames); configuration.set(ConfigPath.ENABLE_CACHE_ITEM_STACK.getPath(), enableCacheItemStack); diff --git a/API/src/main/java/fr/maxlego08/menu/api/enums/PlaceholderAction.java b/API/src/main/java/fr/maxlego08/menu/api/enums/PlaceholderAction.java index 45f23ea5..9ca4932c 100644 --- a/API/src/main/java/fr/maxlego08/menu/api/enums/PlaceholderAction.java +++ b/API/src/main/java/fr/maxlego08/menu/api/enums/PlaceholderAction.java @@ -46,9 +46,14 @@ public static PlaceholderAction from(String string) { if (string == null) return null; for (PlaceholderAction action : values()) { - if (action.name().equalsIgnoreCase(string) || action.aliases.stream().anyMatch(e -> e.equalsIgnoreCase(string))) { + if (action.name().equalsIgnoreCase(string)) { return action; } + for (String alias : action.aliases) { + if (alias.equalsIgnoreCase(string)) { + return action; + } + } } System.err.println("Impossible to find the " + string + " action for placeholder"); return null; diff --git a/API/src/main/java/fr/maxlego08/menu/api/requirement/Action.java b/API/src/main/java/fr/maxlego08/menu/api/requirement/Action.java index f485732d..39846623 100644 --- a/API/src/main/java/fr/maxlego08/menu/api/requirement/Action.java +++ b/API/src/main/java/fr/maxlego08/menu/api/requirement/Action.java @@ -6,9 +6,8 @@ import fr.maxlego08.menu.api.utils.Placeholders; import org.bukkit.entity.Player; +import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; /** * Represents an action that can be executed based on certain conditions. @@ -70,6 +69,13 @@ public void setChance(float chance) { * @return A list of commands that have been processed and flattened with placeholders replaced. */ protected List parseAndFlattenCommands(List liste, Player player) { - return liste.stream().flatMap(cmd -> Stream.of(cmd.split("\n"))).map(cmd -> cmd.replace("%player%", player.getName())).collect(Collectors.toList()); + List commands = new ArrayList<>(); + for (String cmd : liste) { + String[] split = cmd.split("\n"); + for (String part : split) { + commands.add(part.replace("%player%", player.getName())); + } + } + return commands; } } diff --git a/API/src/main/java/fr/maxlego08/menu/api/requirement/ConditionalName.java b/API/src/main/java/fr/maxlego08/menu/api/requirement/ConditionalName.java index 87304426..b29539e1 100644 --- a/API/src/main/java/fr/maxlego08/menu/api/requirement/ConditionalName.java +++ b/API/src/main/java/fr/maxlego08/menu/api/requirement/ConditionalName.java @@ -63,6 +63,11 @@ public int priority() { * otherwise. */ public boolean hasPermission(Player player, Button button, InventoryEngine inventoryEngine, Placeholders placeholders) { - return this.permissibles.stream().allMatch(permissible -> permissible.hasPermission(player, button, inventoryEngine, placeholders)); + for (Permissible permissible : this.permissibles) { + if (!permissible.hasPermission(player, button, inventoryEngine, placeholders)) { + return false; + } + } + return true; } } diff --git a/API/src/main/java/fr/maxlego08/menu/api/utils/Placeholders.java b/API/src/main/java/fr/maxlego08/menu/api/utils/Placeholders.java index 875df119..1bb0c8ff 100644 --- a/API/src/main/java/fr/maxlego08/menu/api/utils/Placeholders.java +++ b/API/src/main/java/fr/maxlego08/menu/api/utils/Placeholders.java @@ -1,9 +1,9 @@ package fr.maxlego08.menu.api.utils; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; public class Placeholders { @@ -43,7 +43,11 @@ public Map getPlaceholders() { * @return the list of parsed strings */ public List parse(List strings) { - return strings.stream().map(this::parse).collect(Collectors.toList()); + List parsed = new ArrayList<>(strings.size()); + for (String string : strings) { + parsed.add(this.parse(string)); + } + return parsed; } /** diff --git a/API/src/main/java/fr/maxlego08/menu/api/utils/cuboid/Cuboid.java b/API/src/main/java/fr/maxlego08/menu/api/utils/cuboid/Cuboid.java index c863a4ea..6ff3e8ad 100644 --- a/API/src/main/java/fr/maxlego08/menu/api/utils/cuboid/Cuboid.java +++ b/API/src/main/java/fr/maxlego08/menu/api/utils/cuboid/Cuboid.java @@ -16,7 +16,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; public class Cuboid implements Iterable, Cloneable, ConfigurationSerializable { @@ -638,11 +637,23 @@ public boolean intersects(Cuboid other) { } public Collection getPlayers() { - return Bukkit.getOnlinePlayers().stream().filter(p -> this.contains(p.getLocation())).collect(Collectors.toList()); + List players = new ArrayList<>(); + for (Player player : Bukkit.getOnlinePlayers()) { + if (this.contains(player.getLocation())) { + players.add(player); + } + } + return players; } public Collection getEntities() { - return getWorld().getLivingEntities().stream().filter(e -> this.contains(e.getLocation())).collect(Collectors.toList()); + List entities = new ArrayList<>(); + for (LivingEntity entity : getWorld().getLivingEntities()) { + if (this.contains(entity.getLocation())) { + entities.add(entity); + } + } + return entities; } public enum CuboidDirection { diff --git a/API/src/main/java/fr/maxlego08/menu/api/utils/cuboid/Region.java b/API/src/main/java/fr/maxlego08/menu/api/utils/cuboid/Region.java index 3f4e36be..f7417fbf 100644 --- a/API/src/main/java/fr/maxlego08/menu/api/utils/cuboid/Region.java +++ b/API/src/main/java/fr/maxlego08/menu/api/utils/cuboid/Region.java @@ -8,8 +8,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.LinkedHashSet; import java.util.List; -import java.util.stream.Collectors; public class Region { @@ -45,11 +45,19 @@ public List getCuboids() { } public Collection getPlayers() { - return this.cuboids.stream().map(Cuboid::getPlayers).flatMap(Collection::stream).distinct().collect(Collectors.toList()); + Collection players = new LinkedHashSet<>(); + for (Cuboid cuboid : this.cuboids) { + players.addAll(cuboid.getPlayers()); + } + return new ArrayList<>(players); } public Collection getEntities() { - return this.cuboids.stream().map(Cuboid::getEntities).flatMap(Collection::stream).distinct().collect(Collectors.toList()); + Collection entities = new LinkedHashSet<>(); + for (Cuboid cuboid : this.cuboids) { + entities.addAll(cuboid.getEntities()); + } + return new ArrayList<>(entities); } public boolean contains(Location location) { diff --git a/Hooks/Paper/src/main/java/fr/maxlego08/menu/hooks/ComponentMeta.java b/Hooks/Paper/src/main/java/fr/maxlego08/menu/hooks/ComponentMeta.java index e18ffb9c..f382acbb 100644 --- a/Hooks/Paper/src/main/java/fr/maxlego08/menu/hooks/ComponentMeta.java +++ b/Hooks/Paper/src/main/java/fr/maxlego08/menu/hooks/ComponentMeta.java @@ -30,7 +30,6 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; public class ComponentMeta implements MetaUpdater { @@ -130,11 +129,15 @@ public void updateLore(ItemMeta itemMeta, List lore, OfflinePlayer offli @SuppressWarnings("unchecked") @Override public void updateLore(ItemMeta itemMeta, List lore, LoreType loreType) { - List components = lore.stream().map(text -> this.cache.get(text, () -> { - // Fixed text becomes italic automatically - // From GitHub issue #62 - return RESET.append(this.MINI_MESSAGE.deserialize(colorMiniMessage(text)).decoration(TextDecoration.ITALIC, getState(text))); - })).collect(Collectors.toList()); + List components = new ArrayList<>(lore.size()); + for (String text : lore) { + Component component = this.cache.get(text, () -> { + // Fixed text becomes italic automatically + // From GitHub issue #62 + return RESET.append(this.MINI_MESSAGE.deserialize(colorMiniMessage(text)).decoration(TextDecoration.ITALIC, getState(text))); + }); + components.add(component); + } if (loreType != LoreType.REPLACE && itemMeta.hasLore()) { try { @@ -239,10 +242,12 @@ public void openBook(Player player, String title, String author, List li Component titleComponent = this.cache.get(title, () -> this.MINI_MESSAGE.deserialize(colorMiniMessage(title))); Component authorComponent = this.cache.get(author, () -> this.MINI_MESSAGE.deserialize(colorMiniMessage(author))); - List linesComponent = lines.stream().map(text -> { + List linesComponent = new ArrayList<>(lines.size()); + for (String text : lines) { String result = plugin.parse(player, text); - return this.cache.get(result, () -> this.MINI_MESSAGE.deserialize(colorMiniMessage(result))); - }).collect(Collectors.toList()); + Component component = this.cache.get(result, () -> this.MINI_MESSAGE.deserialize(colorMiniMessage(result))); + linesComponent.add(component); + } Book book = Book.book(titleComponent, authorComponent, linesComponent); if (player != null) { diff --git a/Hooks/Paper/src/main/java/fr/maxlego08/menu/hooks/dialogs/AbstractDialogManager.java b/Hooks/Paper/src/main/java/fr/maxlego08/menu/hooks/dialogs/AbstractDialogManager.java index e32406b3..0677d194 100644 --- a/Hooks/Paper/src/main/java/fr/maxlego08/menu/hooks/dialogs/AbstractDialogManager.java +++ b/Hooks/Paper/src/main/java/fr/maxlego08/menu/hooks/dialogs/AbstractDialogManager.java @@ -9,6 +9,7 @@ import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; +import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -41,17 +42,21 @@ protected List buildDialogs( Function> builderResolver, BiFunction builderExecutor ) { - return buttons.stream() - .map(button -> { - TYPE type = typeExtractor.apply(button); - if (type == null) return null; - - return builderResolver.apply(type) - .map(builder -> builderExecutor.apply(builder, button)) - .orElse(null); - }) - .filter(Objects::nonNull) - .toList(); + List results = new java.util.ArrayList<>(buttons.size()); + for (B button : buttons) { + TYPE type = typeExtractor.apply(button); + if (type == null) { + continue; + } + Optional builderOptional = builderResolver.apply(type); + if (builderOptional.isPresent()) { + T value = builderExecutor.apply(builderOptional.get(), button); + if (value != null) { + results.add(value); + } + } + } + return results; } protected DialogBase.Builder createDialogBase(String dialogName, String externalTitle, boolean canCloseWithEscape, boolean canPauseGame, String afterAction){ diff --git a/Hooks/Paper/src/main/java/fr/maxlego08/menu/hooks/dialogs/ZDialogManager.java b/Hooks/Paper/src/main/java/fr/maxlego08/menu/hooks/dialogs/ZDialogManager.java index a6545ee7..12542f75 100644 --- a/Hooks/Paper/src/main/java/fr/maxlego08/menu/hooks/dialogs/ZDialogManager.java +++ b/Hooks/Paper/src/main/java/fr/maxlego08/menu/hooks/dialogs/ZDialogManager.java @@ -95,9 +95,12 @@ public Optional getDialog(String pluginName, String fileName) { List pluginDialogs = dialogs.get(pluginName); if (pluginDialogs == null) return Optional.empty(); - return pluginDialogs.stream() - .filter(dialog -> dialog.getFileName().equals(fileName) || dialog.getName(null).equals(fileName)) - .findFirst(); + for (DialogInventory dialog : pluginDialogs) { + if (dialog.getFileName().equals(fileName) || dialog.getName(null).equals(fileName)) { + return Optional.of(dialog); + } + } + return Optional.empty(); } @Override @@ -105,9 +108,12 @@ public Optional getDialog(Plugin plugin, String fileName) { List pluginDialogs = dialogs.get(plugin.getName()); if (pluginDialogs == null) return Optional.empty(); - return pluginDialogs.stream() - .filter(dialog -> dialog.getFileName().equals(fileName)) - .findFirst(); + for (DialogInventory dialog : pluginDialogs) { + if (dialog.getFileName().equals(fileName)) { + return Optional.of(dialog); + } + } + return Optional.empty(); } @Override @@ -133,18 +139,22 @@ public void loadDialogs() { } try (Stream stream = Files.walk(Paths.get(folder.getPath()))) { - stream.skip(1) - .map(Path::toFile) - .filter(File::isFile) - .filter(file -> file.getName().endsWith(".yml")) - .forEach(file -> { - try { - this.loadInventory(this.menuPlugin, file); - } catch (DialogException | InventoryException exception) { - Logger.info("Failed to load dialog from file: " + file.getName(), Logger.LogType.WARNING); - - } - }); + Iterator iterator = stream.iterator(); + if (iterator.hasNext()) { + iterator.next(); + } + while (iterator.hasNext()) { + Path path = iterator.next(); + File file = path.toFile(); + if (file.isFile() && file.getName().endsWith(".yml")) { + try { + this.loadInventory(this.menuPlugin, file); + } catch (DialogException | InventoryException exception) { + Logger.info("Failed to load dialog from file: " + file.getName(), Logger.LogType.WARNING); + + } + } + } } catch (IOException exception) { Logger.info("Failed to load dialogs", Logger.LogType.WARNING); } diff --git a/Hooks/Paper/src/main/java/fr/maxlego08/menu/placeholder/LocalPlaceholder.java b/Hooks/Paper/src/main/java/fr/maxlego08/menu/placeholder/LocalPlaceholder.java index ba277222..93956a1c 100644 --- a/Hooks/Paper/src/main/java/fr/maxlego08/menu/placeholder/LocalPlaceholder.java +++ b/Hooks/Paper/src/main/java/fr/maxlego08/menu/placeholder/LocalPlaceholder.java @@ -6,10 +6,8 @@ import java.util.ArrayList; import java.util.List; -import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; public class LocalPlaceholder { @@ -74,18 +72,24 @@ public String setPlaceholders(OfflinePlayer offlinePlayer, String placeholder) { } public List setPlaceholders(OfflinePlayer offlinePlayer, List lore) { - return lore == null ? null : lore.stream().map(e -> e = setPlaceholders(offlinePlayer, e)).collect(Collectors.toList()); + if (lore == null) { + return null; + } + List parsed = new ArrayList<>(lore.size()); + for (String entry : lore) { + parsed.add(setPlaceholders(offlinePlayer, entry)); + } + return parsed; } public String onRequest(OfflinePlayer offlinePlayer, String string) { - Optional optional = this.autoPlaceholders.stream().filter(e -> string.startsWith(e.startWith())).findFirst(); - if (optional.isPresent()) { - - AutoPlaceholder autoPlaceholder = optional.get(); + for (AutoPlaceholder autoPlaceholder : this.autoPlaceholders) { + if (!string.startsWith(autoPlaceholder.startWith())) { + continue; + } String value = string.replace(autoPlaceholder.startWith(), ""); return autoPlaceholder.accept(offlinePlayer, value); - } return null; diff --git a/src/main/java/fr/maxlego08/menu/ZButtonManager.java b/src/main/java/fr/maxlego08/menu/ZButtonManager.java index 717446a1..593cbb11 100644 --- a/src/main/java/fr/maxlego08/menu/ZButtonManager.java +++ b/src/main/java/fr/maxlego08/menu/ZButtonManager.java @@ -24,7 +24,6 @@ import java.io.File; import java.util.*; -import java.util.stream.Collectors; public class ZButtonManager extends ZUtils implements ButtonManager { @@ -40,9 +39,20 @@ public ZButtonManager(ZMenuPlugin plugin) { @Override public void register(ButtonLoader button) { - var optional = loaders.entrySet().stream().flatMap(e -> e.getValue().stream()).filter(e -> e.getName().equalsIgnoreCase(button.getName())).findFirst(); - if (optional.isPresent()) { - var loader = optional.get(); + ButtonLoader existingLoader = null; + for (List buttonLoaders : loaders.values()) { + for (ButtonLoader loader : buttonLoaders) { + if (loader.getName().equalsIgnoreCase(button.getName())) { + existingLoader = loader; + break; + } + } + if (existingLoader != null) { + break; + } + } + if (existingLoader != null) { + var loader = existingLoader; throw new ButtonAlreadyRegisterException("Button " + button.getName() + " was already register in the " + loader.getPlugin().getName()); } @@ -69,7 +79,11 @@ public void unregisters(Plugin plugin) { @Override public Collection getLoaders() { - return this.loaders.values().stream().flatMap(List::stream).collect(Collectors.toList()); + List flattened = new ArrayList<>(); + for (List buttonLoaders : this.loaders.values()) { + flattened.addAll(buttonLoaders); + } + return flattened; } @Override @@ -79,7 +93,12 @@ public Collection getLoaders(Plugin plugin) { @Override public Optional getLoader(String name) { - return this.getLoaders().stream().filter(e -> e.getName().equalsIgnoreCase(name)).findFirst(); + for (ButtonLoader loader : this.getLoaders()) { + if (loader.getName().equalsIgnoreCase(name)) { + return Optional.of(loader); + } + } + return Optional.empty(); } @Override @@ -113,20 +132,24 @@ public Optional getActionLoader(String key) { @Override public List loadPermissible(List> elements, String path, File file) { - return elements.stream().map(map -> { + List permissibles = new ArrayList<>(); + for (Map map : elements) { + Permissible permissible = null; String type = (String) map.getOrDefault("type", null); - if (type == null) return null; - Optional optional = getPermission(type); - if (optional.isPresent()) { - PermissibleLoader permissibleLoader = optional.get(); - return permissibleLoader.load(path, new TypedMapAccessor(map), file); + if (type != null) { + Optional optional = getPermission(type); + if (optional.isPresent()) { + PermissibleLoader permissibleLoader = optional.get(); + permissible = permissibleLoader.load(path, new TypedMapAccessor(map), file); + } + } + if (permissible != null && permissible.isValid()) { + permissibles.add(permissible); + } else { + Logger.info("Error, an element is invalid in " + path + " for permissible", Logger.LogType.ERROR); } - return null; - }).filter(element -> { - if (element != null && element.isValid()) return true; - Logger.info("Error, an element is invalid in " + path + " for permissible", Logger.LogType.ERROR); - return false; - }).collect(Collectors.toList()); + } + return permissibles; } @Override @@ -137,11 +160,12 @@ public List loadPermissible(YamlConfiguration configuration, String @Override public List loadActions(List> elements, String path, File file) { - return elements.stream().map(map -> { + List actions = new ArrayList<>(); + for (Map map : elements) { String type = (String) map.getOrDefault("type", null); if (type == null) { Logger.info("Error, an element is invalid in " + path + ", type is invalid", Logger.LogType.ERROR); - return null; + continue; } Optional optional = getActionLoader(type); if (optional.isPresent()) { @@ -151,12 +175,13 @@ public List loadActions(List> elements, String path, if (action != null) { action.setDelay(accessor.getInt("delay", 0)); action.setChance(accessor.getFloat("chance", 100)); + actions.add(action); } - return action; + } else { + Logger.info("Error, an element is invalid in " + path + " with type " + type + ", he doesn't exist!", Logger.LogType.ERROR); } - Logger.info("Error, an element is invalid in " + path + " with type " + type + ", he doesn't exist!", Logger.LogType.ERROR); - return null; - }).filter(Objects::nonNull).collect(Collectors.toList()); + } + return actions; } @Override @@ -187,12 +212,26 @@ public Requirement loadRequirement(YamlConfiguration configuration, String path, @Override public List getEmptyActions(List> elements) { - return elements.stream().map(element -> (String) element.get("type")).filter(Objects::nonNull).filter(type -> getActionLoader(type).isEmpty()).collect(Collectors.toList()); + List invalid = new ArrayList<>(); + for (Map element : elements) { + Object typeObj = element.get("type"); + if (typeObj instanceof String type && getActionLoader(type).isEmpty()) { + invalid.add(type); + } + } + return invalid; } @Override public List getEmptyPermissible(List> elements) { - return elements.stream().map(element -> (String) element.get("type")).filter(Objects::nonNull).filter(type -> getPermission(type).isEmpty()).collect(Collectors.toList()); + List invalid = new ArrayList<>(); + for (Map element : elements) { + Object typeObj = element.get("type"); + if (typeObj instanceof String type && getPermission(type).isEmpty()) { + invalid.add(type); + } + } + return invalid; } @Override diff --git a/src/main/java/fr/maxlego08/menu/ZCommand.java b/src/main/java/fr/maxlego08/menu/ZCommand.java index cb08fb50..f29b3011 100644 --- a/src/main/java/fr/maxlego08/menu/ZCommand.java +++ b/src/main/java/fr/maxlego08/menu/ZCommand.java @@ -7,8 +7,8 @@ import org.jetbrains.annotations.NotNull; import java.io.File; +import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; /** * @param plugin The plugin where the command comes from @@ -32,7 +32,11 @@ public record ZCommand(Plugin plugin, String command, List aliases, Stri @Override public List getCommandArguments() { - return this.arguments.stream().map(CommandArgument::getArgument).collect(Collectors.toList()); + List args = new ArrayList<>(this.arguments.size()); + for (CommandArgument argument : this.arguments) { + args.add(argument.getArgument()); + } + return args; } @Override diff --git a/src/main/java/fr/maxlego08/menu/ZCommandManager.java b/src/main/java/fr/maxlego08/menu/ZCommandManager.java index 07010377..ce4c43a8 100644 --- a/src/main/java/fr/maxlego08/menu/ZCommandManager.java +++ b/src/main/java/fr/maxlego08/menu/ZCommandManager.java @@ -27,7 +27,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; -import java.util.stream.Collectors; public class ZCommandManager extends ZUtils implements CommandManager { @@ -64,7 +63,11 @@ public Collection getCommands(Plugin plugin) { @Override public Collection getCommands() { - return this.commands.values().stream().flatMap(List::stream).collect(Collectors.toList()); + List allCommands = new ArrayList<>(); + for (List commandList : this.commands.values()) { + allCommands.addAll(commandList); + } + return allCommands; } @Override @@ -168,7 +171,12 @@ public void load(Persist persist) { @Override public Optional getCommand(Inventory inventory) { - return this.getCommands(inventory.getPlugin()).stream().filter(e -> e.inventory().equals(inventory)).findFirst(); + for (Command command : this.getCommands(inventory.getPlugin())) { + if (command.inventory().equals(inventory)) { + return Optional.of(command); + } + } + return Optional.empty(); } @Override @@ -193,7 +201,12 @@ public Optional getPlayerArgument(Player player, String key) { @Override public Optional getCommand(String commandName) { - return this.getCommands().stream().filter(e -> e.command().equalsIgnoreCase(commandName)).findFirst(); + for (Command command : this.getCommands()) { + if (command.command().equalsIgnoreCase(commandName)) { + return Optional.of(command); + } + } + return Optional.empty(); } @Override @@ -238,6 +251,11 @@ public List getArgumentValidators() { @Override public Optional getArgumentValidator(String argumentTypeName) { - return this.commandArgumentValidators.stream().filter(e -> e.getType().equalsIgnoreCase(argumentTypeName)).findFirst(); + for (CommandArgumentValidator validator : this.commandArgumentValidators) { + if (validator.getType().equalsIgnoreCase(argumentTypeName)) { + return Optional.of(validator); + } + } + return Optional.empty(); } } diff --git a/src/main/java/fr/maxlego08/menu/ZInventory.java b/src/main/java/fr/maxlego08/menu/ZInventory.java index 3c222181..c31216d6 100644 --- a/src/main/java/fr/maxlego08/menu/ZInventory.java +++ b/src/main/java/fr/maxlego08/menu/ZInventory.java @@ -24,7 +24,6 @@ import java.io.File; import java.util.*; -import java.util.stream.Collectors; public class ZInventory extends ZUtils implements Inventory { @@ -76,11 +75,19 @@ public String getName() { public String getName(Player player, InventoryEngine inventoryDefault, Placeholders placeholders) { if (!this.conditionalNames.isEmpty()) { - Optional optional = this.conditionalNames.stream().filter(conditionalName -> conditionalName.hasPermission(player, null, inventoryDefault, placeholders)).max(Comparator.comparingInt(ConditionalName::priority)); + ConditionalName selected = null; + int highestPriority = Integer.MIN_VALUE; + for (ConditionalName conditionalName : this.conditionalNames) { + if (conditionalName.hasPermission(player, null, inventoryDefault, placeholders)) { + if (selected == null || conditionalName.priority() > highestPriority) { + selected = conditionalName; + highestPriority = conditionalName.priority(); + } + } + } - if (optional.isPresent()) { - ConditionalName conditionalName = optional.get(); - return conditionalName.name(); + if (selected != null) { + return selected.name(); } } @@ -118,7 +125,13 @@ public Collection