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

Reply via email to