From: "Enrico Weigelt, metux IT consult" <[email protected]>
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/freecol-developers