From 76aa19622ec65db5a1e71fed1792c183a97818a5 Mon Sep 17 00:00:00 2001 From: Jetz Date: Sun, 15 Sep 2024 17:16:24 -0400 Subject: [PATCH] Guava migration - Replace select usages of `Iterables.filter` --- .../src/main/java/forge/ai/AiController.java | 3 +- .../main/java/forge/ai/ComputerUtilCard.java | 11 ++-- .../main/java/forge/ai/ComputerUtilMana.java | 7 ++- .../src/main/java/forge/ai/SpecialCardAi.java | 4 +- .../forge/ai/ability/ChooseGenericAi.java | 6 +- .../forge/ai/ability/CountersMultiplyAi.java | 5 +- .../main/java/forge/ai/ability/TokenAi.java | 1 - .../src/main/java/forge/card/CardDb.java | 51 +++++++++++---- .../src/main/java/forge/card/CardType.java | 4 +- .../main/java/forge/card/ICardDatabase.java | 4 ++ .../forge/deck/generation/DeckGenPool.java | 8 +-- .../main/java/forge/item/SealedProduct.java | 4 +- .../src/main/java/forge/util/Iterables.java | 7 +-- .../java/forge/util/storage/IStorage.java | 2 + .../java/forge/util/storage/StorageBase.java | 6 ++ .../java/forge/game/ability/AbilityUtils.java | 2 +- .../ability/effects/CopyPermanentEffect.java | 6 +- .../game/ability/effects/PlayEffect.java | 8 +-- .../effects/PlayLandVariantEffect.java | 13 ++-- .../src/main/java/forge/game/card/Card.java | 4 +- .../java/forge/game/card/CardCollection.java | 12 ++++ .../java/forge/game/card/CardDamageMap.java | 7 +-- .../main/java/forge/game/card/CardUtil.java | 6 +- .../forge/game/card/TokenCreateTable.java | 9 +-- .../java/forge/game/combat/CombatUtil.java | 1 - .../spellability/SpellAbilityCondition.java | 7 ++- .../spellability/SpellAbilityRestriction.java | 4 +- .../forge/game/trigger/TriggerHandler.java | 2 +- .../java/forge/gui/ImportSourceAnalyzer.java | 16 ++--- .../java/forge/itemmanager/CardManager.java | 6 +- .../java/forge/itemmanager/ItemManager.java | 2 +- .../PlanarConquestCommanderGeneraterGA.java | 14 ++--- .../PlanarConquestGeneraterGA.java | 14 ++--- .../PlanarConquestTribalGeneraterGA.java | 15 ++--- .../src/forge/adventure/util/CardUtil.java | 17 +++-- .../deck/CardRelationMatrixGenerator.java | 59 +++++++++-------- .../forge/deck/CommanderDeckGenerator.java | 36 +++++------ .../src/main/java/forge/deck/DeckgenUtil.java | 2 +- .../CardThemedCommanderDeckBuilder.java | 8 +-- .../CardThemedConquestDeckBuilder.java | 7 ++- .../limited/CardThemedDeckBuilder.java | 63 ++++++++----------- .../gamemodes/limited/LimitedDeckBuilder.java | 32 +++++----- .../gamemodes/limited/LimitedPlayer.java | 5 +- .../forge/gamemodes/limited/WinstonDraft.java | 7 +-- .../planarconquest/ConquestUtil.java | 2 +- .../forge/gamemodes/quest/BoosterUtils.java | 11 ++-- .../quest/QuestRewardCardChooser.java | 7 +-- .../quest/QuestRewardCardFiltered.java | 7 +-- .../forge/gamemodes/quest/QuestUtilCards.java | 16 +++-- .../forge/player/PlayerControllerHuman.java | 16 ++--- .../java/forge/lda/LDAModelGenetrator.java | 36 +++++------ 51 files changed, 310 insertions(+), 292 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index cdfe1e9b85c..6307829cdf9 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -62,6 +62,7 @@ import io.sentry.Sentry; import java.util.*; import java.util.function.Predicate; +import java.util.stream.Collectors; /** *

@@ -2205,7 +2206,7 @@ public class AiController { // TODO move to more common place private static List filterList(List input, Predicate pred) { - List filtered = Lists.newArrayList(Iterables.filter(input, pred)); + List filtered = input.stream().filter(pred).collect(Collectors.toList()); input.removeAll(filtered); return filtered; } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index ac36d80c602..050574ba77c 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -250,12 +250,11 @@ public class ComputerUtilCard { final List bLand = CardLists.getType(land, sminBL); - for (Card ut : Iterables.filter(bLand, CardPredicates.UNTAPPED)) { - return ut; - } - - // TODO potentially risky if simulation mode currently able to reach this from triggers - return Aggregates.random(bLand); // random tapped land of least represented type + return bLand.stream() + .filter(CardPredicates.UNTAPPED) + .findFirst() + // TODO potentially risky if simulation mode currently able to reach this from triggers + .orElseGet(() -> Aggregates.random(bLand)); // random tapped land of least represented type } /** diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index d3b6ba1144a..7b320ebb9ef 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -41,12 +41,12 @@ import forge.game.trigger.Trigger; import forge.game.trigger.TriggerType; import forge.game.zone.Zone; import forge.game.zone.ZoneType; -import forge.util.Iterables; import forge.util.MyRandom; import forge.util.TextUtil; import org.apache.commons.lang3.StringUtils; import java.util.*; +import java.util.stream.Collectors; public class ComputerUtilMana { private final static boolean DEBUG_MANA_PAYMENT = false; @@ -264,7 +264,10 @@ public class ComputerUtilMana { saList = filteredList; break; case "NotSameCard": - saList = Lists.newArrayList(Iterables.filter(filteredList, saPay -> !saPay.getHostCard().getName().equals(sa.getHostCard().getName()))); + String hostName = sa.getHostCard().getName(); + saList = filteredList.stream() + .filter(saPay -> !saPay.getHostCard().getName().equals(hostName)) + .collect(Collectors.toList()); break; default: break; diff --git a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java index fb8e4c8c5c5..f67ae1cfaf2 100644 --- a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java +++ b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java @@ -685,7 +685,7 @@ public class SpecialCardAi { // Goblin Polka Band public static class GoblinPolkaBand { public static boolean consider(final Player ai, final SpellAbility sa) { - int maxPotentialTgts = Lists.newArrayList(Iterables.filter(ai.getOpponents().getCreaturesInPlay(), CardPredicates.UNTAPPED)).size(); + int maxPotentialTgts = ai.getOpponents().getCreaturesInPlay().filter(CardPredicates.UNTAPPED).size(); int maxPotentialPayment = ComputerUtilMana.determineLeftoverMana(sa, ai, "R", false); int numTgts = Math.min(maxPotentialPayment, maxPotentialTgts); @@ -1295,7 +1295,7 @@ public class SpecialCardAi { public static boolean considerSecondTarget(final Player ai, final SpellAbility sa) { Card firstTgt = sa.getParent().getTargetCard(); - Iterable candidates = Iterables.filter(ai.getOpponents().getCardsIn(ZoneType.Battlefield), + CardCollection candidates = ai.getOpponents().getCardsIn(ZoneType.Battlefield).filter( CardPredicates.sharesCardTypeWith(firstTgt).and(CardPredicates.isTargetableBy(sa))); Card secondTgt = Aggregates.random(candidates); if (secondTgt != null) { diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericAi.java index 29b47d497a8..e9686d20584 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericAi.java @@ -13,11 +13,11 @@ import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.util.Aggregates; -import forge.util.Iterables; import forge.util.collect.FCollection; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public class ChooseGenericAi extends SpellAbilityAi { @@ -84,7 +84,9 @@ public class ChooseGenericAi extends SpellAbilityAi { } else if ("Random".equals(logic)) { return Aggregates.random(spells); } else if ("Phasing".equals(logic)) { // Teferi's Realm : keep aggressive - List filtered = Lists.newArrayList(Iterables.filter(spells, sp -> !sp.getDescription().contains("Creature") && !sp.getDescription().contains("Land"))); + List filtered = spells.stream() + .filter(sp -> !sp.getDescription().contains("Creature") && !sp.getDescription().contains("Land")) + .collect(Collectors.toList()); return Aggregates.random(filtered); } else if ("PayUnlessCost".equals(logic)) { for (final SpellAbility sp : spells) { diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersMultiplyAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersMultiplyAi.java index 522590f4e13..6e1defd5d4b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersMultiplyAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersMultiplyAi.java @@ -23,7 +23,6 @@ import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; -import forge.util.Iterables; public class CountersMultiplyAi extends SpellAbilityAi { @@ -103,7 +102,9 @@ public class CountersMultiplyAi extends SpellAbilityAi { if (list.isEmpty()) { return false; } - Card safeMatch = Iterables.getFirst(Iterables.filter(list, CardPredicates.hasCounters().negate()), null); + Card safeMatch = list.stream() + .filter(CardPredicates.hasCounters().negate()) + .findFirst().orElse(null); sa.getTargets().add(safeMatch == null ? list.getFirst() : safeMatch); return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java index 1798b3a7037..7407e41fb4c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java @@ -2,7 +2,6 @@ package forge.ai.ability; import java.util.List; import java.util.Map; -import java.util.function.Predicate; import forge.ai.AiController; import forge.ai.AiProps; diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index d0bd09571d5..89c851d5750 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -38,6 +38,7 @@ import java.util.*; import java.util.Map.Entry; import java.util.function.Predicate; import java.util.stream.Collectors; +import java.util.stream.Stream; public final class CardDb implements ICardDatabase, IDeckGenPool { public final static String foilSuffix = "+"; @@ -827,7 +828,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { return null; // nothing to do // Filter Cards Editions based on set preferences - List acceptedEditions = Lists.newArrayList(Iterables.filter(cardEditions, artPref::accept)); + List acceptedEditions = cardEditions.stream().filter(artPref::accept).collect(Collectors.toList()); /* At this point, it may be possible that Art Preference is too-strict for the requested card! i.e. acceptedEditions.size() == 0! @@ -899,6 +900,10 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { }).values(); } + public List getUniqueCardsNoAlt(String cardName) { + return Lists.newArrayList(Maps.filterEntries(uniqueCardsByName, entry -> entry.getKey().equals(entry.getValue().getName())).get(getName(cardName))); + } + public PaperCard getUniqueByName(final String name) { return uniqueCardsByName.get(getName(name)); } @@ -940,8 +945,23 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { return Multimaps.filterEntries(allCardsByName, entry -> entry.getKey().equals(entry.getValue().getName())).values(); } - public Collection getAllNonPromoCards() { - return Lists.newArrayList(Iterables.filter(getAllCards(), paperCard -> { + @Override + public Stream streamAllCards() { + return allCardsByName.values().stream(); + } + @Override + public Stream streamUniqueCards() { + return uniqueCardsByName.values().stream(); + } + public Stream streamAllCardsNoAlt() { + return allCardsByName.entries().stream().filter(e -> e.getKey().equals(e.getValue().getName())).map(Entry::getValue); + } + public Stream streamUniqueCardsNoAlt() { + return uniqueCardsByName.entrySet().stream().filter(e -> e.getKey().equals(e.getValue().getName())).map(Entry::getValue); + } + public Stream streamAllNonPromoCards() { + //TODO: This should probably just be a filter to tack onto streamAllCards + return streamAllCards().filter(paperCard -> { CardEdition edition = null; try { edition = editions.getEditionByCodeOrThrow(paperCard.getEdition()); @@ -949,11 +969,19 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { return false; } return edition != null && edition.getType() != Type.PROMO; - })); + }); + } + + public Stream streamAllFaces() { + return facesByName.values().stream(); + } + + public Collection getAllNonPromoCards() { + return streamAllNonPromoCards().collect(Collectors.toList()); } public Collection getUniqueCardsNoAltNoOnline() { - return Lists.newArrayList(Iterables.filter(getUniqueCardsNoAlt(), paperCard -> { + return streamUniqueCardsNoAlt().filter(paperCard -> { CardEdition edition = null; try { edition = editions.getEditionByCodeOrThrow(paperCard.getEdition()); @@ -963,11 +991,12 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { return false; } return true; - })); + }).collect(Collectors.toList()); } public Collection getAllNonPromosNonReprintsNoAlt() { - return Lists.newArrayList(Iterables.filter(getAllCardsNoAlt(), paperCard -> { + //TODO: This should probably also be a stream filter. + return streamAllCardsNoAlt().filter(paperCard -> { CardEdition edition = null; try { edition = editions.getEditionByCodeOrThrow(paperCard.getEdition()); @@ -977,7 +1006,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { return false; } return true; - })); + }).collect(Collectors.toList()); } public String getName(final String cardName) { @@ -1007,19 +1036,19 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { */ @Override public List getAllCards(Predicate predicate) { - return Lists.newArrayList(Iterables.filter(getAllCards(), predicate)); + return streamAllCards().filter(predicate).collect(Collectors.toCollection(ArrayList::new)); } @Override public List getAllCards(final String cardName, Predicate predicate){ - return Lists.newArrayList(Iterables.filter(getAllCards(cardName), predicate)); + return getAllCards(cardName).stream().filter(predicate).collect(Collectors.toCollection(ArrayList::new)); } /** * Returns a modifiable list of cards matching the given predicate */ public List getAllCardsNoAlt(Predicate predicate) { - return Lists.newArrayList(Iterables.filter(getAllCardsNoAlt(), predicate)); + return streamAllCardsNoAlt().filter(predicate).collect(Collectors.toCollection(ArrayList::new)); } // Do I want a foiled version of these cards? diff --git a/forge-core/src/main/java/forge/card/CardType.java b/forge-core/src/main/java/forge/card/CardType.java index 3aa0bc249ad..ae289765fe2 100644 --- a/forge-core/src/main/java/forge/card/CardType.java +++ b/forge-core/src/main/java/forge/card/CardType.java @@ -304,9 +304,7 @@ public final class CardType implements Comparable, CardTypeView { creatureTypes.addAll(getAllCreatureTypes()); creatureTypes.removeAll(this.excludedCreatureSubtypes); } else { - for (final String t : Iterables.filter(subtypes, Predicates.IS_CREATURE_TYPE)) { - creatureTypes.add(t); - } + subtypes.stream().filter(Predicates.IS_CREATURE_TYPE).forEach(creatureTypes::add); } return creatureTypes; } diff --git a/forge-core/src/main/java/forge/card/ICardDatabase.java b/forge-core/src/main/java/forge/card/ICardDatabase.java index 52b86868627..4e4016accce 100644 --- a/forge-core/src/main/java/forge/card/ICardDatabase.java +++ b/forge-core/src/main/java/forge/card/ICardDatabase.java @@ -7,6 +7,7 @@ import java.util.Collection; import java.util.Date; import java.util.List; import java.util.function.Predicate; +import java.util.stream.Stream; public interface ICardDatabase extends Iterable { /** @@ -85,6 +86,9 @@ public interface ICardDatabase extends Iterable { Collection getAllCards(CardEdition edition); Collection getUniqueCards(); + Stream streamAllCards(); + Stream streamUniqueCards(); + /* UTILITY METHODS * =============== */ int getMaxArtIndex(String cardName); diff --git a/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java b/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java index dd3b313f7eb..188c409ed53 100644 --- a/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java +++ b/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java @@ -38,11 +38,9 @@ public class DeckGenPool implements IDeckGenPool { @Override public PaperCard getCard(String name, String edition) { Predicate filter = PaperCardPredicates.printedInSet(edition).and(PaperCardPredicates.name(name)); - Iterable editionCards=Iterables.filter(cards.values(), filter); - if (editionCards.iterator().hasNext()){ - return editionCards.iterator().next(); - } - return getCard(name); + return cards.values().stream() + .filter(filter) + .findFirst().orElseGet(() -> getCard(name)); } @Override diff --git a/forge-core/src/main/java/forge/item/SealedProduct.java b/forge-core/src/main/java/forge/item/SealedProduct.java index 4cddf19bb25..f2fb3ea7743 100644 --- a/forge-core/src/main/java/forge/item/SealedProduct.java +++ b/forge-core/src/main/java/forge/item/SealedProduct.java @@ -22,11 +22,11 @@ import forge.StaticData; import forge.card.CardRulesPredicates; import forge.item.generation.BoosterGenerator; import forge.util.Aggregates; -import forge.util.Iterables; import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; +import java.util.stream.Collectors; public abstract class SealedProduct implements InventoryItemFromSet { @@ -114,6 +114,6 @@ public abstract class SealedProduct implements InventoryItemFromSet { protected List getRandomBasicLands(final String setCode, final int count) { Predicate cardsRule = PaperCardPredicates.printedInSet(setCode) .and(PaperCardPredicates.fromRules(CardRulesPredicates.IS_BASIC_LAND)); - return Aggregates.random(Iterables.filter(StaticData.instance().getCommonCards().getAllCards(), cardsRule), count); + return Aggregates.random(StaticData.instance().getCommonCards().streamAllCards().filter(cardsRule).collect(Collectors.toList()), count); } } diff --git a/forge-core/src/main/java/forge/util/Iterables.java b/forge-core/src/main/java/forge/util/Iterables.java index 6f86363025d..a0d1e9b9911 100644 --- a/forge-core/src/main/java/forge/util/Iterables.java +++ b/forge-core/src/main/java/forge/util/Iterables.java @@ -19,6 +19,9 @@ public class Iterables { public static Iterable filter(Iterable iterable, Predicate filter) { return () -> StreamSupport.stream(iterable.spliterator(), false).filter(filter).iterator(); } + public static Iterable filter(Collection iterable, Predicate filter) { + return () -> iterable.stream().filter(filter).iterator(); + } public static Iterable filter(final Iterable iterable, final Class desiredType) { return () -> StreamSupport.stream(iterable.spliterator(), false) .filter(desiredType::isInstance) @@ -63,10 +66,6 @@ public class Iterables { //TODO: Inline everything below. - public static Iterable filter(Collection iterable, Predicate filter) { - return () -> iterable.stream().filter(filter).iterator(); - } - public static int size(Collection collection) { return collection.size(); diff --git a/forge-core/src/main/java/forge/util/storage/IStorage.java b/forge-core/src/main/java/forge/util/storage/IStorage.java index 3818c8edfbb..e9689f211c1 100644 --- a/forge-core/src/main/java/forge/util/storage/IStorage.java +++ b/forge-core/src/main/java/forge/util/storage/IStorage.java @@ -19,6 +19,7 @@ package forge.util.storage; import java.util.Collection; import java.util.function.Predicate; +import java.util.stream.Stream; import forge.util.IHasName; @@ -35,4 +36,5 @@ public interface IStorage extends Iterable, IHasName { IStorage> getFolders(); IStorage tryGetFolder(String path); IStorage getFolderOrCreate(String path); + Stream stream(); } \ No newline at end of file diff --git a/forge-core/src/main/java/forge/util/storage/StorageBase.java b/forge-core/src/main/java/forge/util/storage/StorageBase.java index 7de2ca73ccc..3683047181d 100644 --- a/forge-core/src/main/java/forge/util/storage/StorageBase.java +++ b/forge-core/src/main/java/forge/util/storage/StorageBase.java @@ -24,6 +24,7 @@ import java.io.File; import java.io.FilenameFilter; import java.util.*; import java.util.function.Predicate; +import java.util.stream.Stream; /** *

@@ -65,6 +66,11 @@ public class StorageBase implements IStorage { return map.values().iterator(); } + @Override + public Stream stream() { + return map.values().stream(); + } + @Override public boolean contains(String name) { return name != null && map.containsKey(name); diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 5d84da5f3e2..1140dfef976 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -495,7 +495,7 @@ public class AbilityUtils { players.addAll(player.getOpponents()); val = playerXCount(players, calcX[1], card, ability); } else if (hType.equals("RegisteredOpponents")) { - players.addAll(Iterables.filter(game.getRegisteredPlayers(), PlayerPredicates.isOpponentOf(player))); + players.addAll(game.getRegisteredPlayers().filter(PlayerPredicates.isOpponentOf(player))); val = playerXCount(players, calcX[1], card, ability); } else if (hType.equals("Other")) { players.addAll(player.getAllOtherPlayers()); diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java index 89ffe7e6f6d..b0aa3745307 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java @@ -150,7 +150,7 @@ public class CopyPermanentEffect extends TokenEffectBase { List tgtCards = Lists.newArrayList(); if (sa.hasParam("ValidSupportedCopy")) { - List cards = Lists.newArrayList(StaticData.instance().getCommonCards().getUniqueCards()); + Iterable cards = StaticData.instance().getCommonCards().getUniqueCards(); String valid = sa.getParam("ValidSupportedCopy"); if (valid.contains("X")) { valid = TextUtil.fastReplace(valid, @@ -158,11 +158,11 @@ public class CopyPermanentEffect extends TokenEffectBase { } if (StringUtils.containsIgnoreCase(valid, "creature")) { Predicate cpp = PaperCardPredicates.fromRules(CardRulesPredicates.IS_CREATURE); - cards = Lists.newArrayList(Iterables.filter(cards, cpp)); + cards = Iterables.filter(cards, cpp); } if (StringUtils.containsIgnoreCase(valid, "equipment")) { Predicate cpp = PaperCardPredicates.fromRules(CardRulesPredicates.IS_EQUIPMENT); - cards = Lists.newArrayList(Iterables.filter(cards, cpp)); + cards = Iterables.filter(cards, cpp); } if (sa.hasParam("RandomCopied")) { List copysource = Lists.newArrayList(cards); diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java index 85efa8f76a1..43d9de299b7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java @@ -2,6 +2,7 @@ package forge.game.ability.effects; import java.util.*; import java.util.function.Predicate; +import java.util.stream.Collectors; import forge.card.CardStateName; import forge.card.GamePieceType; @@ -10,7 +11,6 @@ import forge.util.*; import org.apache.commons.lang3.StringUtils; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; import forge.StaticData; import forge.card.CardRulesPredicates; @@ -117,13 +117,11 @@ public class PlayEffect extends SpellAbilityEffect { cards.add(StaticData.instance().getCommonCards().getUniqueByName(name)); } } else if (valid.equalsIgnoreCase("sorcery")) { - cards = Lists.newArrayList(StaticData.instance().getCommonCards().getUniqueCards()); final Predicate cpp = PaperCardPredicates.fromRules(CardRulesPredicates.IS_SORCERY); - cards = Lists.newArrayList(Iterables.filter(cards, cpp)); + cards = StaticData.instance().getCommonCards().streamUniqueCards().filter(cpp).collect(Collectors.toList()); } else if (valid.equalsIgnoreCase("instant")) { - cards = Lists.newArrayList(StaticData.instance().getCommonCards().getUniqueCards()); final Predicate cpp = PaperCardPredicates.fromRules(CardRulesPredicates.IS_INSTANT); - cards = Lists.newArrayList(Iterables.filter(cards, cpp)); + cards = StaticData.instance().getCommonCards().streamUniqueCards().filter(cpp).collect(Collectors.toList()); } if (sa.hasParam("RandomCopied")) { final CardCollection choice = new CardCollection(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java index a36b078df29..e16508b1fd1 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java @@ -1,7 +1,8 @@ package forge.game.ability.effects; import java.util.List; -import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; import com.google.common.collect.Lists; @@ -18,7 +19,6 @@ import forge.game.spellability.SpellAbility; import forge.item.PaperCard; import forge.item.PaperCardPredicates; import forge.util.Aggregates; -import forge.util.Iterables; public class PlayLandVariantEffect extends SpellAbilityEffect { @@ -28,10 +28,9 @@ public class PlayLandVariantEffect extends SpellAbilityEffect { final Player activator = sa.getActivatingPlayer(); final Game game = source.getGame(); final String landType = sa.getParam("Clone"); - List cards = Lists.newArrayList(StaticData.instance().getCommonCards().getUniqueCards()); + Stream cardStream = StaticData.instance().getCommonCards().streamUniqueCards(); if ("BasicLand".equals(landType)) { - final Predicate cpp = PaperCardPredicates.fromRules(CardRulesPredicates.IS_BASIC_LAND); - cards = Lists.newArrayList(Iterables.filter(cards, cpp)); + cardStream = cardStream.filter(PaperCardPredicates.fromRules(CardRulesPredicates.IS_BASIC_LAND)); } // current color of source card final ColorSet color = source.getColor(); @@ -47,8 +46,8 @@ public class PlayLandVariantEffect extends SpellAbilityEffect { } } - final Predicate cp = x -> landNames.contains(x.getName()); - cards = Lists.newArrayList(Iterables.filter(cards, cp)); + cardStream = cardStream.filter(x -> landNames.contains(x.getName())); + List cards = cardStream.collect(Collectors.toList()); // get a random basic land Card random; // if activator cannot play the random land, loop diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 95dbf2cd41f..895cbc5cde6 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -3371,9 +3371,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { if (ck.isRemoveNonMana()) { // List only has nonMana if (null == mana) { - List toRemove = Lists.newArrayList( - Iterables.filter(list, SpellAbilityPredicates.isManaAbility().negate())); - list.removeAll(toRemove); + list.removeIf(SpellAbilityPredicates.isManaAbility().negate()); } else if (false == mana) { list.clear(); } diff --git a/forge-game/src/main/java/forge/game/card/CardCollection.java b/forge-game/src/main/java/forge/game/card/CardCollection.java index a5dbd4c4bca..684cde8e2ca 100644 --- a/forge-game/src/main/java/forge/game/card/CardCollection.java +++ b/forge-game/src/main/java/forge/game/card/CardCollection.java @@ -2,6 +2,8 @@ package forge.game.card; import forge.util.collect.FCollection; +import java.util.function.Predicate; + public class CardCollection extends FCollection implements CardCollectionView { private static final long serialVersionUID = -8133537013727100275L; @@ -123,6 +125,16 @@ public class CardCollection extends FCollection implements CardCollectionV return new CardCollection(super.subList(fromIndex, toIndex)); } + /** + * Creates a new CardCollection containing the elements from this collection which match + * the given predicate. + */ + public CardCollection filter(Predicate test) { + CardCollection out = new CardCollection(); + this.stream().filter(test).forEach(out::add); + return out; + } + /** * An unmodifiable, empty {@link CardCollection}. */ diff --git a/forge-game/src/main/java/forge/game/card/CardDamageMap.java b/forge-game/src/main/java/forge/game/card/CardDamageMap.java index 00e86fad8d7..e4b190da9ed 100644 --- a/forge-game/src/main/java/forge/game/card/CardDamageMap.java +++ b/forge-game/src/main/java/forge/game/card/CardDamageMap.java @@ -6,11 +6,11 @@ package forge.game.card; import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.stream.Collectors; import com.google.common.collect.ForwardingTable; import com.google.common.collect.HashBasedTable; import com.google.common.collect.Maps; -import com.google.common.collect.Sets; import com.google.common.collect.Table; import forge.game.CardTraitBase; @@ -23,7 +23,6 @@ import forge.game.player.Player; import forge.game.player.PlayerCollection; import forge.game.spellability.SpellAbility; import forge.game.trigger.TriggerType; -import forge.util.Iterables; public class CardDamageMap extends ForwardingTable { private Table dataMap = HashBasedTable.create(); @@ -193,10 +192,10 @@ public class CardDamageMap extends ForwardingTable { Set filteredSource = null; Set filteredTarget = null; if (validSource != null) { - filteredSource = Sets.newHashSet(Iterables.filter(rowKeySet(), GameObjectPredicates.restriction(validSource.split(","), host.getController(), host, sa))); + filteredSource = rowKeySet().stream().filter(GameObjectPredicates.restriction(validSource.split(","), host.getController(), host, sa)).collect(Collectors.toSet()); } if (validTarget != null) { - filteredTarget = Sets.newHashSet(Iterables.filter(columnKeySet(), GameObjectPredicates.restriction(validTarget.split(","), host.getController(), host, sa))); + filteredTarget = columnKeySet().stream().filter(GameObjectPredicates.restriction(validTarget.split(","), host.getController(), host, sa)).collect(Collectors.toSet()); } for (Table.Cell c : cellSet()) { diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index b91f1d70660..0b542956b48 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -19,6 +19,7 @@ package forge.game.card; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; @@ -39,7 +40,6 @@ import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityPredicates; import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; -import forge.util.Iterables; import forge.util.TextUtil; import forge.util.collect.FCollection; @@ -142,7 +142,9 @@ public final class CardUtil { } public static List getThisTurnActivated(final String valid, final Card src, final CardTraitBase ctb, final Player controller) { - return Lists.newArrayList(Iterables.filter(src.getGame().getStack().getAbilityActivatedThisTurn(), SpellAbilityPredicates.isValid(valid.split(","), controller, src, ctb))); + return src.getGame().getStack().getAbilityActivatedThisTurn().stream() + .filter(SpellAbilityPredicates.isValid(valid.split(","), controller, src, ctb)) + .collect(Collectors.toList()); } public static List getCastSinceBeginningOfYourLastTurn(final String valid, final Card src, final CardTraitBase ctb, final Player controller) { diff --git a/forge-game/src/main/java/forge/game/card/TokenCreateTable.java b/forge-game/src/main/java/forge/game/card/TokenCreateTable.java index c138a398346..e4f4b04b51b 100644 --- a/forge-game/src/main/java/forge/game/card/TokenCreateTable.java +++ b/forge-game/src/main/java/forge/game/card/TokenCreateTable.java @@ -2,13 +2,14 @@ package forge.game.card; import java.util.List; import java.util.Map; +import java.util.function.Predicate; +import java.util.stream.Collectors; -import forge.util.Iterables; +import forge.game.GameObject; import org.apache.commons.lang3.ObjectUtils; import com.google.common.collect.ForwardingTable; import com.google.common.collect.HashBasedTable; -import com.google.common.collect.Lists; import com.google.common.collect.Table; import forge.game.CardTraitBase; @@ -48,8 +49,8 @@ public class TokenCreateTable extends ForwardingTable { } if (validOwner != null) { - filteredPlayer = Lists.newArrayList(Iterables.filter(rowKeySet(), - GameObjectPredicates.restriction(validOwner.split(","), host.getController(), host, ctb))); + Predicate restriction = GameObjectPredicates.restriction(validOwner.split(","), host.getController(), host, ctb); + filteredPlayer = rowKeySet().stream().filter(restriction).collect(Collectors.toList()); if (filteredPlayer.isEmpty()) { return 0; } diff --git a/forge-game/src/main/java/forge/game/combat/CombatUtil.java b/forge-game/src/main/java/forge/game/combat/CombatUtil.java index 2c8d1fc26e7..77cc98d5179 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -48,7 +48,6 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.function.Predicate; /** *

diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java index 3858120d826..6dc9828d3ab 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java @@ -34,6 +34,7 @@ import forge.util.collect.FCollection; import org.apache.commons.lang3.StringUtils; import java.util.*; +import java.util.function.Predicate; /** *

@@ -385,7 +386,8 @@ public class SpellAbilityCondition extends SpellAbilityVariables { } } - final int left = Iterables.size(Iterables.filter(list, GameObjectPredicates.restriction(getIsPresent().split(","), activator, host, sa))); + Predicate restriction = GameObjectPredicates.restriction(getIsPresent().split(","), activator, host, sa); + final int left = (int) list.stream().filter(restriction).count(); final String rightString = this.getPresentCompare().substring(2); int right = AbilityUtils.calculateAmount(host, rightString, sa); @@ -416,7 +418,8 @@ public class SpellAbilityCondition extends SpellAbilityVariables { } } - final int left = Iterables.size(Iterables.filter(list, GameObjectPredicates.restriction(getIsPresent2().split(","), activator, host, sa))); + Predicate restriction = GameObjectPredicates.restriction(getIsPresent2().split(","), activator, host, sa); + final int left = (int) list.stream().filter(restriction).count(); final String rightString = this.getPresentCompare2().substring(2); int right = AbilityUtils.calculateAmount(host, rightString, sa); diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java index 9660aaa66aa..f0cae61de69 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java @@ -38,7 +38,6 @@ import forge.game.staticability.StaticAbilityNumLoyaltyAct; import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.util.Expressions; -import forge.util.Iterables; import forge.util.collect.FCollection; /** @@ -468,7 +467,8 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { list = new FCollection<>(game.getCardsIn(getPresentZone())); } - final int left = Iterables.size(Iterables.filter(list, GameObjectPredicates.restriction(getIsPresent().split(","), activator, c, sa))); + Predicate restriction = GameObjectPredicates.restriction(getIsPresent().split(","), activator, c, sa); + final int left = (int) list.stream().filter(restriction).count(); final String rightString = this.getPresentCompare().substring(2); int right = AbilityUtils.calculateAmount(c, rightString, sa); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index bb2f9c48e86..d86382aa9b7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -102,7 +102,7 @@ public class TriggerHandler { public final void handlePlayerDefinedDelTriggers(final Player player) { final List playerTriggers = playerDefinedDelayedTriggers.removeAll(player); - Iterables.filter(playerTriggers, CardTraitPredicates.hasParam("ThisTurn")).forEach(thisTurnDelayedTriggers::add); + playerTriggers.stream().filter(CardTraitPredicates.hasParam("ThisTurn")).forEach(thisTurnDelayedTriggers::add); delayedTriggers.addAll(playerTriggers); } diff --git a/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java b/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java index 5831a95215b..b8a0852fb92 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java +++ b/forge-gui-desktop/src/main/java/forge/gui/ImportSourceAnalyzer.java @@ -24,8 +24,8 @@ import java.util.Map; import java.util.TreeMap; import java.util.function.Predicate; +import forge.card.CardDb; import forge.item.PaperCardPredicates; -import forge.util.Iterables; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; @@ -356,15 +356,15 @@ public class ImportSourceAnalyzer { // set card pics // - private static void addSetCards(final Map cardFileNames, final Iterable library, final Predicate filter) { - for (final PaperCard c : Iterables.filter(library, filter)) { + private static void addSetCards(final Map cardFileNames, final CardDb library, final Predicate filter) { + library.streamAllCards().filter(filter).forEach(c -> { String filename = c.getCardImageKey() + ".jpg"; cardFileNames.put(filename, filename); if (c.hasBackFace()) { filename = c.getCardAltImageKey() + ".jpg"; cardFileNames.put(filename, filename); } - } + }); } Map> cardFileNamesBySet; @@ -375,8 +375,8 @@ public class ImportSourceAnalyzer { for (final CardEdition ce : FModel.getMagicDb().getEditions()) { final Map cardFileNames = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); final Predicate filter = PaperCardPredicates.printedInSet(ce.getCode()); - addSetCards(cardFileNames, FModel.getMagicDb().getCommonCards().getAllCards(), filter); - addSetCards(cardFileNames, FModel.getMagicDb().getVariantCards().getAllCards(), filter); + addSetCards(cardFileNames, FModel.getMagicDb().getCommonCards(), filter); + addSetCards(cardFileNames, FModel.getMagicDb().getVariantCards(), filter); cardFileNamesBySet.put(ce.getCode2(), cardFileNames); } @@ -384,14 +384,14 @@ public class ImportSourceAnalyzer { nameUpdates = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); final Predicate predPlanes = arg0 -> arg0.getRules().getType().isPlane() || arg0.getRules().getType().isPhenomenon(); - for (final PaperCard c : Iterables.filter(FModel.getMagicDb().getVariantCards().getAllCards(), predPlanes)) { + FModel.getMagicDb().getVariantCards().streamAllCards().filter(predPlanes).forEach(c -> { String baseName = c.getCardImageKey(); nameUpdates.put(baseName + ".full.jpg", baseName + ".jpg"); if (c.hasBackFace()) { baseName = c.getCardAltImageKey(); nameUpdates.put(baseName + ".full.jpg", baseName + ".jpg"); } - } + }); } final CardEdition.Collection editions = FModel.getMagicDb().getEditions(); diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java index 1b3f3100eb8..78e4b86a5df 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/CardManager.java @@ -16,12 +16,13 @@ import forge.model.FModel; import forge.screens.home.quest.DialogChooseFormats; import forge.screens.home.quest.DialogChooseSets; import forge.screens.match.controllers.CDetailPicture; -import forge.util.Iterables; import forge.util.Localizer; import javax.swing.*; import java.util.*; import java.util.Map.Entry; +import java.util.function.Predicate; +import java.util.stream.Collectors; /** * ItemManager for cards @@ -76,7 +77,8 @@ public class CardManager extends ItemManager { continue; // skip card // Try to retain only those editions accepted by the current Card Art Preference Policy - List acceptedEditions = Lists.newArrayList(Iterables.filter(entriesByEdition.keySet(), ed -> StaticData.instance().getCardArtPreference().accept(ed))); + Predicate editionPredicate = ed -> StaticData.instance().getCardArtPreference().accept(ed); + List acceptedEditions = entriesByEdition.keySet().stream().filter(editionPredicate).collect(Collectors.toList()); // If policy too strict, fall back to getting all editions. if (acceptedEditions.size() == 0) diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java b/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java index 79c0b3fc5a9..cd29558f492 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/ItemManager.java @@ -1007,7 +1007,7 @@ public abstract class ItemManager extends JPanel implem this.model.addItems(items); } else if (useFilter) { - final Predicate> pred = x -> this.filterPredicate.test(x.getKey());; + final Predicate> pred = x -> this.filterPredicate.test(x.getKey()); this.model.addItems(Iterables.filter(this.pool, pred)); } else if (this.wantUnique) { diff --git a/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestCommanderGeneraterGA.java b/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestCommanderGeneraterGA.java index 8dfef11ac4a..fd0b1411a02 100644 --- a/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestCommanderGeneraterGA.java +++ b/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestCommanderGeneraterGA.java @@ -3,8 +3,7 @@ package forge.planarconquestgenerate; import java.io.File; import java.util.ArrayList; import java.util.List; - -import com.google.common.collect.Lists; +import java.util.stream.Collectors; import forge.GuiDesktop; import forge.StaticData; @@ -24,7 +23,6 @@ import forge.item.PaperCardPredicates; import forge.localinstance.properties.ForgeConstants; import forge.localinstance.properties.ForgePreferences; import forge.model.FModel; -import forge.util.Iterables; public class PlanarConquestCommanderGeneraterGA extends PlanarConquestGeneraterGA { @@ -75,14 +73,14 @@ public class PlanarConquestCommanderGeneraterGA extends PlanarConquestGeneraterG cards.add(StaticData.instance().getCommonCards().getUniqueByName(cardName)); } - Iterable filtered= Iterables.filter(cards, - PaperCardPredicates.fromRules(CardRulesPredicates.IS_KEPT_IN_AI_DECKS + List filteredList = cards.stream() + .filter(PaperCardPredicates.fromRules(CardRulesPredicates.IS_KEPT_IN_AI_DECKS .and(CardRulesPredicates.IS_PLANESWALKER) //.and(CardRulesPredicates.IS_LEGENDARY) - ).and(gameFormat.getFilterPrinted()) - ); + )) + .filter(gameFormat.getFilterPrinted()) + .collect(Collectors.toList()); - List filteredList = Lists.newArrayList(filtered); rankedList = CardRanker.rankCardsInDeck(filteredList); List decks = new ArrayList<>(); for(PaperCard card: rankedList.subList(0,cardsToUse)){ diff --git a/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestGeneraterGA.java b/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestGeneraterGA.java index 1a452f70acf..43dd1acc27d 100644 --- a/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestGeneraterGA.java +++ b/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestGeneraterGA.java @@ -4,13 +4,12 @@ import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import forge.item.PaperCardPredicates; import forge.util.*; import org.apache.commons.lang3.tuple.Pair; -import com.google.common.collect.Lists; - import forge.GuiDesktop; import forge.LobbyPlayer; import forge.StaticData; @@ -106,13 +105,12 @@ public class PlanarConquestGeneraterGA extends AbstractGeneticAlgorithm { cards.add(StaticData.instance().getCommonCards().getUniqueByName(cardName)); } - Iterable filtered= Iterables.filter(cards, - PaperCardPredicates.fromRules(CardRulesPredicates.IS_KEPT_IN_AI_DECKS - .and(CardRulesPredicates.IS_NON_LAND) - ).and(gameFormat.getFilterPrinted()) - ); + List filteredList = cards.stream() + .filter(PaperCardPredicates.fromRules(CardRulesPredicates.IS_KEPT_IN_AI_DECKS + .and(CardRulesPredicates.IS_NON_LAND))) + .filter(gameFormat.getFilterPrinted()) + .collect(Collectors.toList()); - List filteredList = Lists.newArrayList(filtered); setRankedList(CardRanker.rankCardsInDeck(filteredList)); List decks = new ArrayList<>(); for(PaperCard card: getRankedList().subList(0,cardsToUse)){ diff --git a/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestTribalGeneraterGA.java b/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestTribalGeneraterGA.java index c49fece3438..efb4c9e26b7 100644 --- a/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestTribalGeneraterGA.java +++ b/forge-gui-desktop/src/test/java/forge/planarconquestgenerate/PlanarConquestTribalGeneraterGA.java @@ -3,8 +3,7 @@ package forge.planarconquestgenerate; import java.io.File; import java.util.ArrayList; import java.util.List; - -import com.google.common.collect.Lists; +import java.util.stream.Collectors; import forge.GuiDesktop; import forge.StaticData; @@ -23,7 +22,6 @@ import forge.item.PaperCardPredicates; import forge.localinstance.properties.ForgeConstants; import forge.localinstance.properties.ForgePreferences; import forge.model.FModel; -import forge.util.Iterables; public class PlanarConquestTribalGeneraterGA extends PlanarConquestGeneraterGA { @@ -77,14 +75,13 @@ public class PlanarConquestTribalGeneraterGA extends PlanarConquestGeneraterGA { cards.add(StaticData.instance().getCommonCards().getUniqueByName(cardName)); } - Iterable filteredTribe= Iterables.filter(cards, - PaperCardPredicates.fromRules(CardRulesPredicates.IS_KEPT_IN_AI_DECKS + List filteredListTribe = cards.stream() + .filter(PaperCardPredicates.fromRules(CardRulesPredicates.IS_KEPT_IN_AI_DECKS .and(CardRulesPredicates.hasCreatureType("Pirate")) - .and(CardRulesPredicates.IS_CREATURE) - ).and(gameFormat.getFilterPrinted()) - ); + .and(CardRulesPredicates.IS_CREATURE))) + .filter(gameFormat.getFilterPrinted()) + .collect(Collectors.toList()); - List filteredListTribe = Lists.newArrayList(filteredTribe); rankedList = CardRanker.rankCardsInDeck(filteredListTribe); List decks = new ArrayList<>(); for(PaperCard card: rankedList.subList(0,cardsToUse)){ diff --git a/forge-gui-mobile/src/forge/adventure/util/CardUtil.java b/forge-gui-mobile/src/forge/adventure/util/CardUtil.java index dfd2eabe7d0..1afb48d1b44 100644 --- a/forge-gui-mobile/src/forge/adventure/util/CardUtil.java +++ b/forge-gui-mobile/src/forge/adventure/util/CardUtil.java @@ -2,7 +2,6 @@ package forge.adventure.util; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.Json; -import com.google.common.collect.Lists; import forge.StaticData; import forge.adventure.data.ConfigData; import forge.adventure.data.GeneratedDeckData; @@ -27,6 +26,7 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.function.Predicate; import java.util.regex.Pattern; +import java.util.stream.Collectors; import static forge.adventure.data.RewardData.generateAllCards; @@ -804,15 +804,22 @@ public class CardUtil { } public static PaperCard getCardByName(String cardName) { - List validCards = Lists.newArrayList(Iterables.filter(getFullCardPool(Config.instance().getSettingData().useAllCardVariants), - input -> input.getCardName().equals(cardName))); + List validCards; + //Faster to ask the CardDB for a card name than it is to search the pool. + if (Config.instance().getSettingData().useAllCardVariants) + validCards = FModel.getMagicDb().getCommonCards().getAllCards(cardName); + else + validCards = FModel.getMagicDb().getCommonCards().getUniqueCardsNoAlt(cardName); return validCards.get(Current.world().getRandom().nextInt(validCards.size())); } public static PaperCard getCardByNameAndEdition(String cardName, String edition) { - List validCards = Lists.newArrayList(Iterables.filter(getFullCardPool(Config.instance().getSettingData().useAllCardVariants), - input -> input.getCardName().equals(cardName) && input.getEdition().equals(edition))); + List cardPool = Config.instance().getSettingData().useAllCardVariants + ? FModel.getMagicDb().getCommonCards().getAllCards(cardName) + : FModel.getMagicDb().getCommonCards().getUniqueCardsNoAlt(cardName); + List validCards = cardPool.stream() + .filter(input -> input.getEdition().equals(edition)).collect(Collectors.toList()); if (validCards.isEmpty()) { System.err.println("Unexpected behavior: tried to call getCardByNameAndEdition for card " + cardName + " from the edition " + edition + ", but didn't find it in the DB. A random existing instance will be returned."); diff --git a/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java b/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java index 06ee1d63bfb..57b7bb0e324 100644 --- a/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java +++ b/forge-gui/src/main/java/forge/deck/CardRelationMatrixGenerator.java @@ -9,13 +9,11 @@ import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import forge.item.PaperCardPredicates; -import forge.util.Iterables; import org.apache.commons.lang3.ArrayUtils; -import com.google.common.collect.Lists; - import forge.card.CardRulesPredicates; import forge.deck.io.CardThemedMatrixIO; import forge.deck.io.DeckStorage; @@ -73,9 +71,9 @@ public final class CardRelationMatrixGenerator { ForgeConstants.DECK_GEN_DIR, false), true); - final Iterable cards = Iterables.filter(format.getAllCards(), - PaperCardPredicates.fromRules(CardRulesPredicates.NOT_TRUE_BASIC_LAND)); - List cardList = Lists.newArrayList(cards); + List cardList = format.getAllCards().stream() + .filter(PaperCardPredicates.fromRules(CardRulesPredicates.NOT_TRUE_BASIC_LAND)) + .collect(Collectors.toList()); cardList.add(FModel.getMagicDb().getCommonCards().getCard("Wastes")); Map cardIntegerMap = new HashMap<>(); Map integerCardMap = new HashMap<>(); @@ -88,18 +86,19 @@ public final class CardRelationMatrixGenerator { for (PaperCard card:cardList){ for (Deck deck:decks){ - if (deck.getMain().contains(card)){ - for (PaperCard pairCard:Iterables.filter(deck.getMain().toFlatList(), - PaperCardPredicates.fromRules(CardRulesPredicates.NOT_TRUE_BASIC_LAND))){ - if (!pairCard.getName().equals(card.getName())){ + if (deck.getMain().contains(card)) { + String cardName = card.getName(); + deck.getMain().toFlatList().stream() + .filter(PaperCardPredicates.fromRules(CardRulesPredicates.NOT_TRUE_BASIC_LAND)) + .filter(pairCard -> !pairCard.getName().equals(cardName)) + .forEach(pairCard -> { try { - int old = matrix[cardIntegerMap.get(card.getName())][cardIntegerMap.get(pairCard.getName())]; - matrix[cardIntegerMap.get(card.getName())][cardIntegerMap.get(pairCard.getName())] = old + 1; - }catch (NullPointerException ne){ + int old = matrix[cardIntegerMap.get(cardName)][cardIntegerMap.get(pairCard.getName())]; + matrix[cardIntegerMap.get(cardName)][cardIntegerMap.get(pairCard.getName())] = old + 1; + } catch (NullPointerException ne) { //Todo: Not sure what was failing here } - } - } + }); } } } @@ -142,9 +141,9 @@ public final class CardRelationMatrixGenerator { true); //get all cards - final Iterable cards = Iterables.filter(FModel.getMagicDb().getCommonCards().getUniqueCards(), - PaperCardPredicates.fromRules(CardRulesPredicates.NOT_TRUE_BASIC_LAND)); - List cardList = Lists.newArrayList(cards); + List cardList = FModel.getMagicDb().getCommonCards().streamUniqueCards() + .filter(PaperCardPredicates.fromRules(CardRulesPredicates.NOT_TRUE_BASIC_LAND)) + .collect(Collectors.toList()); cardList.add(FModel.getMagicDb().getCommonCards().getCard("Wastes")); Map cardIntegerMap = new HashMap<>(); Map integerCardMap = new HashMap<>(); @@ -157,7 +156,7 @@ public final class CardRelationMatrixGenerator { } //filter to just legal commanders - List legends = Lists.newArrayList(Iterables.filter(cardList, format.isLegalCommanderPredicate())); + List legends = cardList.stream().filter(format.isLegalCommanderPredicate()).collect(Collectors.toList()); //generate lookups for legends to link commander names to matrix rows for (int i=0; i cardIntegerMap, Map legendIntegerMap, int[][] matrix){ - for (PaperCard pairCard:Iterables.filter(deck.getMain().toFlatList(), - PaperCardPredicates.fromRules(CardRulesPredicates.NOT_TRUE_BASIC_LAND))){ - if (!pairCard.getName().equals(legend.getName())){ + String cardName = legend.getName(); + deck.getMain().toFlatList().stream() + .filter(PaperCardPredicates.fromRules(CardRulesPredicates.NOT_TRUE_BASIC_LAND)) + .filter(pairCard -> !pairCard.getName().equals(cardName)) + .forEach(pairCard -> { try { - int old = matrix[legendIntegerMap.get(legend.getName())][cardIntegerMap.get(pairCard.getName())]; - matrix[legendIntegerMap.get(legend.getName())][cardIntegerMap.get(pairCard.getName())] = old + 1; - }catch (NullPointerException ne){ + int old = matrix[legendIntegerMap.get(cardName)][cardIntegerMap.get(pairCard.getName())]; + matrix[legendIntegerMap.get(cardName)][cardIntegerMap.get(pairCard.getName())] = old + 1; + } catch (NullPointerException ne) { //Todo: Not sure what was failing here ne.printStackTrace(); } - } - - } + }); //add partner commanders to matrix if(deck.getCommanders().size()>1){ for(PaperCard partner:deck.getCommanders()){ if(!partner.equals(legend)){ - int old = matrix[legendIntegerMap.get(legend.getName())][cardIntegerMap.get(partner.getName())]; - matrix[legendIntegerMap.get(legend.getName())][cardIntegerMap.get(partner.getName())] = old + 1; + int old = matrix[legendIntegerMap.get(cardName)][cardIntegerMap.get(partner.getName())]; + matrix[legendIntegerMap.get(cardName)][cardIntegerMap.get(partner.getName())] = old + 1; } } } diff --git a/forge-gui/src/main/java/forge/deck/CommanderDeckGenerator.java b/forge-gui/src/main/java/forge/deck/CommanderDeckGenerator.java index faa53cdbcf2..2a53a6d0ae8 100644 --- a/forge-gui/src/main/java/forge/deck/CommanderDeckGenerator.java +++ b/forge-gui/src/main/java/forge/deck/CommanderDeckGenerator.java @@ -1,9 +1,10 @@ package forge.deck; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.function.Predicate; +import java.util.stream.Collectors; import forge.card.CardEdition; import forge.card.CardRules; @@ -13,7 +14,6 @@ import forge.item.PaperCard; import forge.item.PaperCardPredicates; import forge.model.FModel; import forge.util.ItemPool; -import forge.util.Iterables; /** * Created by maustin on 09/05/2017. @@ -23,11 +23,11 @@ public class CommanderDeckGenerator extends DeckProxy implements Comparable uniqueCards; if (isCardGen){ uniqueCards = new ItemPool<>(PaperCard.class); String matrixKey = (format.equals(DeckFormat.TinyLeaders) ? DeckFormat.Commander : format).toString(); //use Commander for Tiny Leaders - HashMap matrixPool = CardRelationMatrixGenerator.cardPools.get(matrixKey); + HashMap>> matrixPool = CardRelationMatrixGenerator.cardPools.get(matrixKey); if (matrixPool != null) { Iterable legendNames = matrixPool.keySet(); for (String legendName : legendNames) { @@ -39,18 +39,15 @@ public class CommanderDeckGenerator extends DeckProxy implements Comparable canPlay = isForAi ? DeckGeneratorBase.AI_CAN_PLAY : CardRulesPredicates.IS_KEPT_IN_RANDOM_DECKS; - @SuppressWarnings("unchecked") - Iterable legends = Iterables.filter(uniqueCards.toFlatList(), format.isLegalCommanderPredicate() - .and(PaperCardPredicates.fromRules(canPlay))); - final List decks = new ArrayList<>(); - for (PaperCard legend: legends) { - decks.add(new CommanderDeckGenerator(legend, format, isForAi, isCardGen)); - } - return decks; + return uniqueCards.toFlatList().stream() + .filter(format.isLegalCommanderPredicate()) + .filter(PaperCardPredicates.fromRules(canPlay)) + .map(legend -> new CommanderDeckGenerator(legend, format, isForAi, isCardGen)) + .collect(Collectors.toList()); } public static List getBrawlDecks(final DeckFormat format, boolean isForAi, boolean isCardGen){ - ItemPool uniqueCards; + ItemPool uniqueCards; if (isCardGen){ uniqueCards = new ItemPool<>(PaperCard.class); //TODO: update to actual Brawl model from real Brawl decks @@ -63,14 +60,11 @@ public class CommanderDeckGenerator extends DeckProxy implements Comparable canPlay = isForAi ? DeckGeneratorBase.AI_CAN_PLAY : CardRulesPredicates.IS_KEPT_IN_RANDOM_DECKS; - @SuppressWarnings("unchecked") - Iterable legends = Iterables.filter(uniqueCards.toFlatList(), format.isLegalCardPredicate() - .and(PaperCardPredicates.fromRules(CardRulesPredicates.CAN_BE_BRAWL_COMMANDER.and(canPlay)))); - final List decks = new ArrayList<>(); - for (PaperCard legend: legends) { - decks.add(new CommanderDeckGenerator(legend, format, isForAi, isCardGen)); - } - return decks; + return uniqueCards.toFlatList().stream() + .filter(format.isLegalCardPredicate()) + .filter(PaperCardPredicates.fromRules(CardRulesPredicates.CAN_BE_BRAWL_COMMANDER.and(canPlay))) + .map(legend -> new CommanderDeckGenerator(legend, format, isForAi, isCardGen)) + .collect(Collectors.toList()); } private final PaperCard legend; diff --git a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java index 39e9e6e47b0..0b43529be0b 100644 --- a/forge-gui/src/main/java/forge/deck/DeckgenUtil.java +++ b/forge-gui/src/main/java/forge/deck/DeckgenUtil.java @@ -841,7 +841,7 @@ public class DeckgenUtil { // determine how many additional lands we need, but don't take lands already in deck into consideration, // or we risk incorrectly determining the target deck size - int numLands = Iterables.size(Iterables.filter(cards, PaperCardPredicates.fromRules(CardRulesPredicates.IS_LAND))); + int numLands = (int) cards.stream().filter(PaperCardPredicates.fromRules(CardRulesPredicates.IS_LAND)).count(); int sizeNoLands = cards.size() - numLands; // attempt to determine if building for sealed, constructed or EDH diff --git a/forge-gui/src/main/java/forge/gamemodes/limited/CardThemedCommanderDeckBuilder.java b/forge-gui/src/main/java/forge/gamemodes/limited/CardThemedCommanderDeckBuilder.java index 33242ff86b1..c410df4f374 100644 --- a/forge-gui/src/main/java/forge/gamemodes/limited/CardThemedCommanderDeckBuilder.java +++ b/forge-gui/src/main/java/forge/gamemodes/limited/CardThemedCommanderDeckBuilder.java @@ -1,6 +1,7 @@ package forge.gamemodes.limited; import java.util.List; +import java.util.stream.Collectors; import com.google.common.collect.Lists; @@ -11,7 +12,6 @@ import forge.deck.generation.DeckGenPool; import forge.item.PaperCard; import forge.item.PaperCardPredicates; import forge.model.FModel; -import forge.util.Iterables; /** * Created by maustin on 28/02/2018. @@ -25,9 +25,9 @@ public class CardThemedCommanderDeckBuilder extends CardThemedDeckBuilder { secondKeyCard = partner0; // remove Unplayables if(isForAI) { - final Iterable playables = Iterables.filter(availableList, - PaperCardPredicates.fromRules(CardRulesPredicates.IS_KEPT_IN_AI_DECKS)); - this.aiPlayables = Lists.newArrayList(playables); + this.aiPlayables = availableList.stream() + .filter(PaperCardPredicates.fromRules(CardRulesPredicates.IS_KEPT_IN_AI_DECKS)) + .collect(Collectors.toList()); }else{ this.aiPlayables = Lists.newArrayList(availableList); } diff --git a/forge-gui/src/main/java/forge/gamemodes/limited/CardThemedConquestDeckBuilder.java b/forge-gui/src/main/java/forge/gamemodes/limited/CardThemedConquestDeckBuilder.java index 214d68ab8b3..1b4cf443bc9 100644 --- a/forge-gui/src/main/java/forge/gamemodes/limited/CardThemedConquestDeckBuilder.java +++ b/forge-gui/src/main/java/forge/gamemodes/limited/CardThemedConquestDeckBuilder.java @@ -1,6 +1,7 @@ package forge.gamemodes.limited; import java.util.List; +import java.util.stream.Collectors; import com.google.common.collect.Lists; @@ -29,9 +30,9 @@ public class CardThemedConquestDeckBuilder extends CardThemedDeckBuilder { secondKeyCard = null; // remove Unplayables if(isForAI) { - final Iterable playables = Iterables.filter(availableList, - PaperCardPredicates.fromRules(CardRulesPredicates.IS_KEPT_IN_AI_DECKS)); - this.aiPlayables = Lists.newArrayList(playables); + this.aiPlayables = availableList.stream() + .filter(PaperCardPredicates.fromRules(CardRulesPredicates.IS_KEPT_IN_AI_DECKS)) + .collect(Collectors.toList()); }else{ this.aiPlayables = Lists.newArrayList(availableList); } diff --git a/forge-gui/src/main/java/forge/gamemodes/limited/CardThemedDeckBuilder.java b/forge-gui/src/main/java/forge/gamemodes/limited/CardThemedDeckBuilder.java index 64bbf3e007d..ae3349ec1d5 100644 --- a/forge-gui/src/main/java/forge/gamemodes/limited/CardThemedDeckBuilder.java +++ b/forge-gui/src/main/java/forge/gamemodes/limited/CardThemedDeckBuilder.java @@ -9,6 +9,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Predicate; +import java.util.stream.Collectors; import com.google.common.collect.Lists; @@ -104,9 +105,9 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { this.isForAI = isForAI; // remove Unplayables if(isForAI) { - final Iterable playables = Iterables.filter(availableList, - PaperCardPredicates.fromRules(CardRulesPredicates.IS_KEPT_IN_AI_DECKS)); - this.aiPlayables = Lists.newArrayList(playables); + this.aiPlayables = availableList.stream() + .filter(PaperCardPredicates.fromRules(CardRulesPredicates.IS_KEPT_IN_AI_DECKS)) + .collect(Collectors.toList()); }else{ this.aiPlayables = Lists.newArrayList(availableList); } @@ -188,9 +189,9 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { System.out.println(keyCard.getName()); System.out.println("Colors: " + colors.toEnumSet().toString()); } - Iterable colorList = Iterables.filter(aiPlayables, - PaperCardPredicates.fromRules(hasColor)); - rankedColorList = Lists.newArrayList(colorList); + rankedColorList = aiPlayables.stream() + .filter(PaperCardPredicates.fromRules(hasColor)) + .collect(Collectors.toList()); onColorCreaturesAndSpells = Iterables.filter(rankedColorList, PaperCardPredicates.fromRules(CardRulesPredicates.IS_CREATURE .or(CardRulesPredicates.IS_NON_CREATURE_SPELL))); @@ -318,11 +319,11 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { //Add remaining non-land colour matching cards to sideboard final CardPool cp = result.getOrCreate(DeckSection.Sideboard); - Iterable potentialSideboard = Iterables.filter(aiPlayables, - PaperCardPredicates.fromRules(hasColor.and(CardRulesPredicates.IS_NON_LAND))); + Iterator potentialSideboard = aiPlayables.stream() + .filter(PaperCardPredicates.fromRules(hasColor.and(CardRulesPredicates.IS_NON_LAND))).iterator(); int i=0; - while(i<15 && potentialSideboard.iterator().hasNext()){ - PaperCard sbCard = potentialSideboard.iterator().next(); + while(i<15 && potentialSideboard.hasNext()){ + PaperCard sbCard = potentialSideboard.next(); cp.add(sbCard); aiPlayables.remove(sbCard); rankedColorList.remove(sbCard); @@ -398,8 +399,9 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { } // Add the second keycard if not land if(secondKeyCard!=null && !secondKeyCard.getRules().getMainPart().getType().isLand()) { - Iterable secondKeyCards = Iterables.filter(aiPlayables, PaperCardPredicates.name(secondKeyCard.getName())); - final List keyCardList = Lists.newArrayList(secondKeyCards); + final List keyCardList = aiPlayables.stream() + .filter(PaperCardPredicates.name(secondKeyCard.getName())) + .collect(Collectors.toList()); deckList.addAll(keyCardList); aiPlayables.removeAll(keyCardList); rankedColorList.removeAll(keyCardList); @@ -418,8 +420,9 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { } // Add the deck card if(secondKeyCard!=null && secondKeyCard.getRules().getMainPart().getType().isLand()) { - Iterable secondKeyCards = Iterables.filter(aiPlayables, PaperCardPredicates.name(secondKeyCard.getName())); - final List keyCardList = Lists.newArrayList(secondKeyCards); + final List keyCardList = aiPlayables.stream() + .filter(PaperCardPredicates.name(secondKeyCard.getName())) + .collect(Collectors.toList()); deckList.addAll(keyCardList); aiPlayables.removeAll(keyCardList); rankedColorList.removeAll(keyCardList); @@ -444,7 +447,7 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { * If evolving wilds is in the deck and there are fewer than 4 spaces for basic lands - remove evolving wilds */ protected void checkEvolvingWilds(){ - List evolvingWilds = Lists.newArrayList(Iterables.filter(deckList, PaperCardPredicates.name("Evolving Wilds"))); + List evolvingWilds = deckList.stream().filter(PaperCardPredicates.name("Evolving Wilds")).collect(Collectors.toList()); if((evolvingWilds.size()>0 && landsNeeded<4 ) || colors.countColors()<2){ deckList.removeAll(evolvingWilds); landsNeeded=landsNeeded+evolvingWilds.size(); @@ -497,9 +500,9 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { } protected void addLowCMCCard(){ - final Iterable nonLands = Iterables.filter(rankedColorList, - PaperCardPredicates.fromRules(CardRulesPredicates.IS_NON_LAND)); - final PaperCard card = Iterables.getFirst(nonLands, null); + final PaperCard card = rankedColorList.stream() + .filter(PaperCardPredicates.fromRules(CardRulesPredicates.IS_NON_LAND)) + .findFirst().orElse(null); if (card != null) { deckList.add(card); aiPlayables.remove(card); @@ -665,17 +668,10 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { * counts of lands needed, by color */ private void addLands(final int[] clrCnts) { - // basic lands that are available in the deck - final Iterable basicLands = Iterables.filter(aiPlayables, PaperCardPredicates.fromRules(CardRulesPredicates.IS_BASIC_LAND)); - // total of all ClrCnts int totalColor = 0; - int numColors = 0; for (int i = 0; i < 5; i++) { totalColor += clrCnts[i]; - if (clrCnts[i] > 0) { - numColors++; - } } // add one of each land required first so that any rounding errors do not remove the only land of a colour for (int i = 0; i < 5; i++) { @@ -821,9 +817,6 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { minBasics=Math.round((MyRandom.getRandom().nextInt(8)+6)*((float) targetSize) / 60); } - lands = Iterables.filter(aiPlayables, - PaperCardPredicates.fromRules(CardRulesPredicates.IS_NONBASIC_LAND)); - for (final PaperCard card : lands) { if (landsNeeded > minBasics) { // Use only lands that are within our colors @@ -922,16 +915,10 @@ public class CardThemedDeckBuilder extends DeckGeneratorBase { for (int i = 1; i < 7; i++) { creatureCosts.put(i, 0); } - final Predicate filter = PaperCardPredicates.fromRules(CardRulesPredicates.IS_CREATURE); - for (final IPaperCard creature : Iterables.filter(deckList, filter)) { - int cmc = creature.getRules().getManaCost().getCMC(); - if (cmc < 1) { - cmc = 1; - } else if (cmc > 6) { - cmc = 6; - } - creatureCosts.put(cmc, creatureCosts.get(cmc) + 1); - } + deckList.stream().filter(PaperCardPredicates.fromRules(CardRulesPredicates.IS_CREATURE)) + .mapToInt(c -> c.getRules().getManaCost().getCMC()) + .map(cmc -> Math.min(Math.max(cmc, 1), 6)) + .forEach(cmc -> creatureCosts.put(cmc, creatureCosts.get(cmc) + 1)); List creaturesToAdd = new ArrayList<>(); for (final PaperCard card : creatures) { diff --git a/forge-gui/src/main/java/forge/gamemodes/limited/LimitedDeckBuilder.java b/forge-gui/src/main/java/forge/gamemodes/limited/LimitedDeckBuilder.java index 9e2e09d4fc0..9959ce4fdfb 100644 --- a/forge-gui/src/main/java/forge/gamemodes/limited/LimitedDeckBuilder.java +++ b/forge-gui/src/main/java/forge/gamemodes/limited/LimitedDeckBuilder.java @@ -2,6 +2,7 @@ package forge.gamemodes.limited; import java.util.*; import java.util.function.Predicate; +import java.util.stream.Collectors; import com.google.common.collect.Lists; @@ -76,15 +77,15 @@ public class LimitedDeckBuilder extends DeckGeneratorBase { this.colors = pClrs.getChosenColors(); // remove Unplayables - final Iterable playables = Iterables.filter(availableList, - PaperCardPredicates.fromRules(CardRulesPredicates.IS_KEPT_IN_AI_LIMITED_DECKS)); - this.aiPlayables = Lists.newArrayList(playables); + this.aiPlayables = availableList.stream() + .filter(PaperCardPredicates.fromRules(CardRulesPredicates.IS_KEPT_IN_AI_LIMITED_DECKS)) + .collect(Collectors.toList()); this.availableList.removeAll(aiPlayables); // keep Conspiracies in a separate list - final Iterable conspiracies = Iterables.filter(aiPlayables, - PaperCardPredicates.fromRules(CardRulesPredicates.coreType(true, "Conspiracy"))); - this.draftedConspiracies = Lists.newArrayList(conspiracies); + this.draftedConspiracies = aiPlayables.stream() + .filter(PaperCardPredicates.fromRules(CardRulesPredicates.coreType(true, "Conspiracy"))) + .collect(Collectors.toList()); this.aiPlayables.removeAll(draftedConspiracies); findBasicLandSets(); @@ -164,9 +165,9 @@ public class LimitedDeckBuilder extends DeckGeneratorBase { // 6. If there are still on-color cards, and the average cmc is low, add // an extra. if (deckList.size() == numSpellsNeeded && getAverageCMC(deckList) < 4) { - final Iterable nonLands = Iterables.filter(rankedColorList, - PaperCardPredicates.fromRules(CardRulesPredicates.IS_NON_LAND)); - final PaperCard card = Iterables.getFirst(nonLands, null); + final PaperCard card = rankedColorList.stream() + .filter(PaperCardPredicates.fromRules(CardRulesPredicates.IS_NON_LAND)) + .findFirst().orElse(null); if (card != null) { deckList.add(card); aiPlayables.remove(card); @@ -665,15 +666,10 @@ public class LimitedDeckBuilder extends DeckGeneratorBase { creatureCosts.put(i, 0); } final Predicate filter = PaperCardPredicates.fromRules(CardRulesPredicates.IS_CREATURE); - for (final IPaperCard creature : Iterables.filter(deckList, filter)) { - int cmc = creature.getRules().getManaCost().getCMC(); - if (cmc < 1) { - cmc = 1; - } else if (cmc > 6) { - cmc = 6; - } - creatureCosts.put(cmc, creatureCosts.get(cmc) + 1); - } + deckList.stream().filter(filter) + .mapToInt(creature -> creature.getRules().getManaCost().getCMC()) + .map(cmc -> Math.max(1, Math.min(cmc, 6))) + .forEach(cmc -> creatureCosts.put(cmc, creatureCosts.get(cmc) + 1)); List creaturesToAdd = new ArrayList<>(); for (final PaperCard card : creatures) { diff --git a/forge-gui/src/main/java/forge/gamemodes/limited/LimitedPlayer.java b/forge-gui/src/main/java/forge/gamemodes/limited/LimitedPlayer.java index 3043e2ff9df..bac699548a2 100644 --- a/forge-gui/src/main/java/forge/gamemodes/limited/LimitedPlayer.java +++ b/forge-gui/src/main/java/forge/gamemodes/limited/LimitedPlayer.java @@ -14,6 +14,7 @@ import forge.util.Iterables; import forge.util.TextUtil; import java.util.*; +import java.util.stream.Collectors; public class LimitedPlayer { // A Player class for inside some type of limited environment, like Draft. @@ -731,7 +732,9 @@ public class LimitedPlayer { public void addSingleBoosterPack() { // if this is just a normal draft, allow picking a pack from any set // If this is adventure or quest or whatever then we should limit it to something - List possibleEditions = Lists.newArrayList(Iterables.filter(FModel.getMagicDb().getEditions(), CardEdition.Predicates.CAN_MAKE_BOOSTER)); + List possibleEditions = FModel.getMagicDb().getEditions().stream() + .filter(CardEdition.Predicates.CAN_MAKE_BOOSTER) + .collect(Collectors.toList()); CardEdition edition = chooseEdition(possibleEditions); if (edition == null) { addLog(name() + " chose not to add a booster pack to the draft."); diff --git a/forge-gui/src/main/java/forge/gamemodes/limited/WinstonDraft.java b/forge-gui/src/main/java/forge/gamemodes/limited/WinstonDraft.java index ec0439ce7b2..89b7470cdba 100644 --- a/forge-gui/src/main/java/forge/gamemodes/limited/WinstonDraft.java +++ b/forge-gui/src/main/java/forge/gamemodes/limited/WinstonDraft.java @@ -10,7 +10,6 @@ import forge.deck.CardPool; import forge.deck.Deck; import forge.item.PaperCard; import forge.item.PaperCardPredicates; -import forge.util.Iterables; import forge.util.MyRandom; public class WinstonDraft extends BoosterDraft { @@ -41,9 +40,9 @@ public class WinstonDraft extends BoosterDraft { for (final Supplier> supply : this.product) { for (int j = 0; j < NUM_PLAYERS; j++) { // Remove Basic Lands from draft for simplicity - for (final PaperCard paperCard : Iterables.filter(supply.get(), PaperCardPredicates.IS_BASIC_LAND.negate())) { - this.deck.add(paperCard); - } + supply.get().stream() + .filter(PaperCardPredicates.IS_BASIC_LAND.negate()) + .forEach(this.deck::add); } } Collections.shuffle(this.deck, MyRandom.getRandom()); diff --git a/forge-gui/src/main/java/forge/gamemodes/planarconquest/ConquestUtil.java b/forge-gui/src/main/java/forge/gamemodes/planarconquest/ConquestUtil.java index 881255a3316..195a6bdbe8d 100644 --- a/forge-gui/src/main/java/forge/gamemodes/planarconquest/ConquestUtil.java +++ b/forge-gui/src/main/java/forge/gamemodes/planarconquest/ConquestUtil.java @@ -156,7 +156,7 @@ public class ConquestUtil { if (colorIdentity != MagicColor.ALL_COLORS) { Predicate pred = DeckFormat.Commander.isLegalCardForCommanderPredicate(deck.getCommanders()); - availableCards.retainAll(Lists.newArrayList(Iterables.filter(availableCards, pred))); + availableCards.removeIf(pred.negate()); } //create pool from available cards diff --git a/forge-gui/src/main/java/forge/gamemodes/quest/BoosterUtils.java b/forge-gui/src/main/java/forge/gamemodes/quest/BoosterUtils.java index 6968cbaa095..9612e1c249a 100644 --- a/forge-gui/src/main/java/forge/gamemodes/quest/BoosterUtils.java +++ b/forge-gui/src/main/java/forge/gamemodes/quest/BoosterUtils.java @@ -21,14 +21,13 @@ import static forge.gamemodes.quest.QuestUtilCards.isLegalInQuestFormat; import java.util.*; import java.util.function.Predicate; +import java.util.stream.Collectors; import forge.item.*; import forge.util.Iterables; import forge.util.Predicates; import org.apache.commons.lang3.StringUtils; -import com.google.common.collect.Lists; - import forge.card.CardEdition; import forge.card.CardRules; import forge.card.CardRulesPredicates; @@ -121,7 +120,7 @@ public final class BoosterUtils { filter = formatStartingPool.getFilterPrinted(); } - final List cardPool = Lists.newArrayList(Iterables.filter(FModel.getMagicDb().getCommonCards().getAllNonPromoCards(), filter)); + final List cardPool = FModel.getMagicDb().getCommonCards().streamAllNonPromoCards().filter(filter).collect(Collectors.toList()); if (userPrefs != null && userPrefs.grantCompleteSet()) { for (PaperCard card : cardPool) { @@ -304,7 +303,7 @@ public final class BoosterUtils { Predicate predicateRules = CardRulesPredicates.cost(StringOp.CONTAINS_IC, "p/"); Predicate predicateCard = PaperCardPredicates.fromRules(predicateRules); - int size = Iterables.size(Iterables.filter(cardPool, predicateCard)); + int size = (int) cardPool.stream().filter(predicateCard).count(); int totalSize = cardPool.size(); double phyrexianAmount = (double) size / totalSize; @@ -326,7 +325,7 @@ public final class BoosterUtils { //Adjust for the number of multicolored possibilities. This prevents flooding of non-selected //colors if multicolored cards aren't in the selected sets. The more multi-colored cards in the //sets, the more that will be selected. - if (usedMulticolor / 8 < Iterables.size(Iterables.filter(cardPool, predicateCard))) { + if (usedMulticolor / 8 < cardPool.stream().filter(predicateCard).count()) { colorFilters.add(predicateRules); usedMulticolor++; } else { @@ -490,7 +489,7 @@ public final class BoosterUtils { PrintSheet ps = new PrintSheet("Quest rewards"); Predicate predicate = preds.size() == 1 ? preds.get(0) : Predicates.and(preds); - ps.addAll(Iterables.filter(FModel.getMagicDb().getCommonCards().getAllNonPromoCards(), predicate)); + FModel.getMagicDb().getCommonCards().streamAllNonPromoCards().filter(predicate).forEach(ps::add); rewards.addAll(ps.random(qty, true)); } else if (temp.length == 2 && temp[0].equalsIgnoreCase("duplicate") && temp[1].equalsIgnoreCase("card")) { // Type 2: a duplicate card of the players choice diff --git a/forge-gui/src/main/java/forge/gamemodes/quest/QuestRewardCardChooser.java b/forge-gui/src/main/java/forge/gamemodes/quest/QuestRewardCardChooser.java index 29cb0ff13b1..f194ea29cf8 100644 --- a/forge-gui/src/main/java/forge/gamemodes/quest/QuestRewardCardChooser.java +++ b/forge-gui/src/main/java/forge/gamemodes/quest/QuestRewardCardChooser.java @@ -9,7 +9,6 @@ import java.util.function.Predicate; import forge.item.PaperCard; import forge.model.FModel; import forge.util.ItemPool; -import forge.util.Iterables; /** * Resolves a card chooser InventoryItem into a CardPrinted. @@ -109,10 +108,8 @@ public class QuestRewardCardChooser extends QuestRewardCard { } else if (type == poolType.predicateFilter) { List cardChoices = new ArrayList<>(); - for (final PaperCard card : Iterables.filter(FModel.getMagicDb().getCommonCards().getAllCards(), predicates)) { - cardChoices.add(card); - } - Collections.sort(cardChoices); + FModel.getMagicDb().getCommonCards().streamAllCards().filter(predicates) + .sorted().forEach(cardChoices::add); //TODO: Once java is at 10+, can use Collectors.toUnmodifiableList return Collections.unmodifiableList(cardChoices); } else { diff --git a/forge-gui/src/main/java/forge/gamemodes/quest/QuestRewardCardFiltered.java b/forge-gui/src/main/java/forge/gamemodes/quest/QuestRewardCardFiltered.java index d14fe24078f..7e69b107121 100644 --- a/forge-gui/src/main/java/forge/gamemodes/quest/QuestRewardCardFiltered.java +++ b/forge-gui/src/main/java/forge/gamemodes/quest/QuestRewardCardFiltered.java @@ -7,7 +7,6 @@ import java.util.function.Predicate; import forge.item.PaperCard; import forge.model.FModel; -import forge.util.Iterables; /** * Allows the player to choose a card from a predicate-filtered list of cards. @@ -60,10 +59,8 @@ public class QuestRewardCardFiltered extends QuestRewardCard { @Override public final List getChoices() { List cardChoices = new ArrayList<>(); - for (final PaperCard card : Iterables.filter(FModel.getMagicDb().getCommonCards().getAllCards(), predicates)) { - cardChoices.add(card); - } - Collections.sort(cardChoices); + FModel.getMagicDb().getCommonCards().streamAllCards().filter(predicates) + .sorted().forEach(cardChoices::add); //TODO: Once java is at 10+, can use Collectors.toUnmodifiableList return Collections.unmodifiableList(cardChoices); } diff --git a/forge-gui/src/main/java/forge/gamemodes/quest/QuestUtilCards.java b/forge-gui/src/main/java/forge/gamemodes/quest/QuestUtilCards.java index f948eb26b79..5881ea1cd2b 100644 --- a/forge-gui/src/main/java/forge/gamemodes/quest/QuestUtilCards.java +++ b/forge-gui/src/main/java/forge/gamemodes/quest/QuestUtilCards.java @@ -47,6 +47,7 @@ import java.util.List; import java.util.Map.Entry; import java.util.function.Function; import java.util.function.Predicate; +import java.util.stream.Collectors; /** * This is a helper class to execute operations on QuestData. It has been @@ -111,10 +112,10 @@ public final class QuestUtilCards { wastesCodes.add("OGW"); } } else { - Iterable allEditions = FModel.getMagicDb().getEditions(); - for (CardEdition edition : Iterables.filter(allEditions, CardEdition.Predicates.hasBasicLands)) { - landCodes.add(edition.getCode()); - } + FModel.getMagicDb().getEditions().stream() + .filter(CardEdition.Predicates.hasBasicLands) + .map(CardEdition::getCode) + .forEach(landCodes::add); snowLandCodes.add("ICE"); snowLandCodes.add("CSP"); snowLandCodes.add("KHM"); @@ -667,12 +668,9 @@ public final class QuestUtilCards { if (questController.getFormat() != null) { formatFilter = formatFilter.and(isLegalInQuestFormat(questController.getFormat())); } - Iterable rightEditions = Iterables.filter(FModel.getMagicDb().getEditions(), formatFilter); - List editions = new ArrayList<>(); - for (CardEdition e : rightEditions) { - editions.add(e); - } + List editions = FModel.getMagicDb().getEditions().stream() + .filter(formatFilter).collect(Collectors.toList()); Collections.shuffle(editions); diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 50d47dce45e..bb039b17b85 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -1805,16 +1805,12 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont @Override public ICardFace chooseSingleCardFace(final SpellAbility sa, final String message, final Predicate cpp, final String name) { - final Iterable cardsFromDb = FModel.getMagicDb().getCommonCards().getAllFaces(); - final List cards = Lists.newArrayList(Iterables.filter(cardsFromDb, cpp)); - CardFaceView cardFaceView; - List choices = new ArrayList<>(); - for (ICardFace cardFace : cards) { - cardFaceView = new CardFaceView(CardTranslation.getTranslatedName(cardFace.getName()), cardFace.getName()); - choices.add(cardFaceView); - } - Collections.sort(choices); - cardFaceView = getGui().one(message, choices); + List choices = FModel.getMagicDb().getCommonCards().streamAllFaces() + .filter(cpp) + .map(cardFace -> new CardFaceView(CardTranslation.getTranslatedName(cardFace.getName()), cardFace.getName())) + .sorted() + .collect(Collectors.toList()); + CardFaceView cardFaceView = getGui().one(message, choices); return StaticData.instance().getCommonCards().getFaceByName(cardFaceView.getOracleName()); } diff --git a/forge-lda/src/main/java/forge/lda/LDAModelGenetrator.java b/forge-lda/src/main/java/forge/lda/LDAModelGenetrator.java index 070f476b399..c6a1dee9ecf 100644 --- a/forge-lda/src/main/java/forge/lda/LDAModelGenetrator.java +++ b/forge-lda/src/main/java/forge/lda/LDAModelGenetrator.java @@ -1,7 +1,5 @@ package forge.lda; -import com.google.common.collect.Lists; - import forge.GuiDesktop; import forge.StaticData; import forge.card.CardRulesPredicates; @@ -19,7 +17,6 @@ import forge.item.PaperCard; import forge.localinstance.properties.ForgeConstants; import forge.localinstance.properties.ForgePreferences; import forge.model.FModel; -import forge.util.Iterables; import forge.util.storage.IStorage; import forge.util.storage.StorageImmediatelySerialized; import org.apache.commons.lang3.ArrayUtils; @@ -27,6 +24,7 @@ import org.apache.commons.lang3.tuple.Pair; import java.io.File; import java.util.*; +import java.util.stream.Collectors; import static forge.lda.lda.inference.InferenceMethod.CGS; @@ -290,9 +288,9 @@ public final class LDAModelGenetrator { true); //get all cards - final Iterable cards = Iterables.filter(FModel.getMagicDb().getCommonCards().getUniqueCards(), - PaperCardPredicates.fromRules(CardRulesPredicates.NOT_TRUE_BASIC_LAND)); - List cardList = Lists.newArrayList(cards); + List cardList = FModel.getMagicDb().getCommonCards().streamUniqueCards() + .filter(PaperCardPredicates.fromRules(CardRulesPredicates.NOT_TRUE_BASIC_LAND)) + .collect(Collectors.toList()); cardList.add(FModel.getMagicDb().getCommonCards().getCard("Wastes")); Map cardIntegerMap = new HashMap<>(); Map integerCardMap = new HashMap<>(); @@ -305,9 +303,9 @@ public final class LDAModelGenetrator { } //filter to just legal commanders - List legends = Lists.newArrayList(Iterables.filter(cardList, PaperCardPredicates.fromRules( - DeckFormat.Commander::isLegalCommander)) - ); + List legends = cardList.stream() + .filter(PaperCardPredicates.fromRules(DeckFormat.Commander::isLegalCommander)) + .collect(Collectors.toList()); //generate lookups for legends to link commander names to matrix rows for (int i=0; i cardIntegerMap, Map legendIntegerMap, int[][] matrix){ - for (PaperCard pairCard:Iterables.filter(deck.getMain().toFlatList(), - PaperCardPredicates.fromRules(CardRulesPredicates.NOT_TRUE_BASIC_LAND))){ - if (!pairCard.getName().equals(legend.getName())){ + String cardName = legend.getName(); + deck.getMain().toFlatList().stream() + .filter(PaperCardPredicates.fromRules(CardRulesPredicates.NOT_TRUE_BASIC_LAND)) + .filter(PaperCardPredicates.name(cardName).negate()) + .forEach(pairCard -> { try { - int old = matrix[legendIntegerMap.get(legend.getName())][cardIntegerMap.get(pairCard.getName())]; - matrix[legendIntegerMap.get(legend.getName())][cardIntegerMap.get(pairCard.getName())] = old + 1; + int old = matrix[legendIntegerMap.get(cardName)][cardIntegerMap.get(pairCard.getName())]; + matrix[legendIntegerMap.get(cardName)][cardIntegerMap.get(pairCard.getName())] = old + 1; }catch (NullPointerException ne){ //TODO: Not sure what was failing here ne.printStackTrace(); } - } - - } + }); //add partner commanders to matrix if(deck.getCommanders().size()>1){ for(PaperCard partner:deck.getCommanders()){ if(!partner.equals(legend)){ - int old = matrix[legendIntegerMap.get(legend.getName())][cardIntegerMap.get(partner.getName())]; - matrix[legendIntegerMap.get(legend.getName())][cardIntegerMap.get(partner.getName())] = old + 1; + int old = matrix[legendIntegerMap.get(cardName)][cardIntegerMap.get(partner.getName())]; + matrix[legendIntegerMap.get(cardName)][cardIntegerMap.get(partner.getName())] = old + 1; } } }