From: "Enrico Weigelt, metux IT consult" <enrico.weig...@gr13.net>
The current implementation of thee disposable list generation goes a long detour, building up a long chain of (mostly single-item) streams. IOW: at lot of allocations and a long linked-list. Finally that's then serialized into an plain list anyways. So, just turn it around: let the getDisposable() methods fill in their items into a given list and forget about streams at all. --- src/net/sf/freecol/common/model/Colony.java | 14 ++++++++++---- .../sf/freecol/common/model/FreeColGameObject.java | 13 ++++++++----- src/net/sf/freecol/common/model/GoodsLocation.java | 10 +++++----- src/net/sf/freecol/common/model/UnitLocation.java | 8 ++++---- src/net/sf/freecol/common/networking/ChangeSet.java | 21 ++++++++++++++------- 5 files changed, 41 insertions(+), 25 deletions(-) diff --git a/src/net/sf/freecol/common/model/Colony.java b/src/net/sf/freecol/common/model/Colony.java index 67f1a307dad..83491089da1 100644 --- a/src/net/sf/freecol/common/model/Colony.java +++ b/src/net/sf/freecol/common/model/Colony.java @@ -2557,10 +2557,16 @@ loop: for (WorkLocation wl : getWorkLocationsForProducing(goodsType)) { * {@inheritDoc} */ @Override - public Stream<FreeColGameObject> getDisposables() { - return concat(flatten(getAllWorkLocations(), - WorkLocation::getDisposables), - super.getDisposables()); + public void getDisposables(List<FreeColGameObject> list) { + synchronized (this.colonyTiles) { + for (ColonyTile walk : this.colonyTiles) + walk.getDisposables(list); + } + synchronized (this.buildingMap) { + for (Building walk : this.buildingMap.values()) + walk.getDisposables(list); + } + super.getDisposables(list); } diff --git a/src/net/sf/freecol/common/model/FreeColGameObject.java b/src/net/sf/freecol/common/model/FreeColGameObject.java index e7626cb6bad..f6ebdce1afa 100644 --- a/src/net/sf/freecol/common/model/FreeColGameObject.java +++ b/src/net/sf/freecol/common/model/FreeColGameObject.java @@ -21,7 +21,8 @@ package net.sf.freecol.common.model; import java.util.logging.Level; import java.util.logging.Logger; -import java.util.stream.Stream; +import java.util.ArrayList; +import java.util.List; import javax.xml.stream.XMLStreamException; @@ -174,7 +175,9 @@ public abstract class FreeColGameObject extends FreeColObject { if (this.disposed) return; LogBuilder lb = new LogBuilder(64); lb.add("Destroying:"); - for (FreeColGameObject fcgo : toList(getDisposables())) { + List<FreeColGameObject> dl = new ArrayList<>(); + getDisposables(dl); + for (FreeColGameObject fcgo : dl) { lb.add(" ", fcgo.getId()); fcgo.disposeResources(); } @@ -212,10 +215,10 @@ public abstract class FreeColGameObject extends FreeColObject { * Overriding routines should call upwards towards this routine, * arranging that the object itself is last. * - * @return A stream of {@code FreeColGameObject}s to dispose of. + * @param dl target list to fill elements into */ - public Stream<FreeColGameObject> getDisposables() { - return Stream.of(this); + public void getDisposables(List<FreeColGameObject> dl) { + dl.add(this); } /** diff --git a/src/net/sf/freecol/common/model/GoodsLocation.java b/src/net/sf/freecol/common/model/GoodsLocation.java index cc9917784e1..13a8e9e89f1 100644 --- a/src/net/sf/freecol/common/model/GoodsLocation.java +++ b/src/net/sf/freecol/common/model/GoodsLocation.java @@ -22,7 +22,6 @@ package net.sf.freecol.common.model; import java.util.Collections; import java.util.List; import java.util.logging.Logger; -import java.util.stream.Stream; import javax.xml.stream.XMLStreamException; @@ -303,10 +302,11 @@ public abstract class GoodsLocation extends UnitLocation { * {@inheritDoc} */ @Override - public Stream<FreeColGameObject> getDisposables() { - Stream<FreeColGameObject> up = super.getDisposables(); - return (this.goodsContainer == null) ? up - : concat(this.goodsContainer.getDisposables(), up); + public void getDisposables(List<FreeColGameObject> dl) { + if (this.goodsContainer != null) + this.goodsContainer.getDisposables(dl); + + super.getDisposables(dl); } diff --git a/src/net/sf/freecol/common/model/UnitLocation.java b/src/net/sf/freecol/common/model/UnitLocation.java index 7bbbf03f480..a50758b38f1 100644 --- a/src/net/sf/freecol/common/model/UnitLocation.java +++ b/src/net/sf/freecol/common/model/UnitLocation.java @@ -23,7 +23,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.logging.Logger; -import java.util.stream.Stream; import javax.xml.stream.XMLStreamException; @@ -263,11 +262,12 @@ public abstract class UnitLocation extends FreeColGameObject implements Location * {@inheritDoc} */ @Override - public Stream<FreeColGameObject> getDisposables() { + public void getDisposables(List<FreeColGameObject> dl) { synchronized (this.units) { - return concat(flatten(this.units, Unit::getDisposables), - super.getDisposables()); + for (Unit u : this.units) + u.getDisposables(dl); } + super.getDisposables(dl); } /** diff --git a/src/net/sf/freecol/common/networking/ChangeSet.java b/src/net/sf/freecol/common/networking/ChangeSet.java index 48bef9f74cb..35234ff1536 100644 --- a/src/net/sf/freecol/common/networking/ChangeSet.java +++ b/src/net/sf/freecol/common/networking/ChangeSet.java @@ -24,7 +24,6 @@ import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; -import java.util.stream.Stream; import net.sf.freecol.common.model.Ability; import net.sf.freecol.common.model.Feature; @@ -724,9 +723,11 @@ public class ChangeSet { public List<Change> consequences(ServerPlayer serverPlayer) { if (seeOld(serverPlayer) && !seeNew(serverPlayer) && !unit.isDisposed()) { + List<Unit> ul = new ArrayList<>(); + ul.add(unit); List<Change> changes = new ArrayList<>(); changes.add(new RemoveChange(See.only(serverPlayer), - unit.getLocation(), Stream.of(unit))); + unit.getLocation(), ul)); return changes; } return Collections.<Change>emptyList(); @@ -1032,10 +1033,10 @@ public class ChangeSet { * @param objects The {@code FreeColGameObject}s to remove. */ public RemoveChange(See see, Location loc, - Stream<? extends FreeColGameObject> objects) { + List<? extends FreeColGameObject> objects) { super(see); this.tile = (loc instanceof Tile) ? (Tile)loc : null; - this.contents = toList(objects); + this.contents = objects; this.fcgo = this.contents.remove(this.contents.size() - 1); } @@ -1535,8 +1536,10 @@ public class ChangeSet { */ public ChangeSet addDisappear(ServerPlayer owner, Tile tile, FreeColGameObject fcgo) { + List<FreeColGameObject> fl = new ArrayList<>(); + fl.add(fcgo); changes.add(new RemoveChange(See.perhaps().except(owner), tile, - Stream.of(fcgo))); + fl)); changes.add(new ObjectChange(See.perhaps().except(owner), tile)); return this; } @@ -1716,7 +1719,9 @@ public class ChangeSet { * @return The updated {@code ChangeSet}. */ public ChangeSet addRemove(See see, Location loc, FreeColGameObject obj) { - changes.add(new RemoveChange(see, loc, obj.getDisposables()));//-vis + List<FreeColGameObject> dl = new ArrayList<>(); + obj.getDisposables(dl); + changes.add(new RemoveChange(see, loc, dl));//-vis return this; } @@ -1731,7 +1736,9 @@ public class ChangeSet { public ChangeSet addRemoves(See see, Location loc, List<? extends FreeColGameObject> objects) { for (FreeColGameObject fcgo : objects) { - changes.add(new RemoveChange(see, loc, fcgo.getDisposables())); + List<FreeColGameObject> dl = new ArrayList<>(); + fcgo.getDisposables(dl); + changes.add(new RemoveChange(see, loc, dl)); } return this; } -- 2.11.0.rc0.7.gbe5a750 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, SlashDot.org! http://sdm.link/slashdot _______________________________________________ Freecol-developers mailing list Freecol-developers@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/freecol-developers