diff --git a/gs-common/src/main/java/org/genericsystem/common/Differential.java b/gs-common/src/main/java/org/genericsystem/common/Differential.java index a99db1cda..9ed1d5df5 100644 --- a/gs-common/src/main/java/org/genericsystem/common/Differential.java +++ b/gs-common/src/main/java/org/genericsystem/common/Differential.java @@ -1,7 +1,9 @@ package org.genericsystem.common; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Stream; import org.genericsystem.api.core.FiltersBuilder; @@ -28,6 +30,7 @@ public class Differential implements IDifferential { private final IDifferential subDifferential; protected final PseudoConcurrentCollection adds = new PseudoConcurrentCollection<>(); protected final PseudoConcurrentCollection removes = new PseudoConcurrentCollection<>(); + private Map> dependenciesAsOservableListCacheMap = new HashMap<>(); public Differential(IDifferential subDifferential) { this.subDifferential = subDifferential; @@ -110,18 +113,23 @@ public Stream unfilteredStream() { @Override public ObservableList toObservableList() { - return BindingsTools.createMinimalUnitaryChangesBinding(BindingsTools.transmitSuccessiveInvalidations(new ListBinding() { - private final Observable invalidator = cache != null ? cache.getObservable(generic) : getObservable(generic); - { - bind(invalidator); - invalidate(); - } - - @Override - protected ObservableList computeValue() { - return FXCollections.observableList(cache != null ? cache.getDependencies(generic).toList() : Differential.this.getDependencies(generic).toList()); - } - })); + ObservableList result = dependenciesAsOservableListCacheMap.get(generic); + if (result == null) { + result = BindingsTools.createMinimalUnitaryChangesBinding(BindingsTools.transmitSuccessiveInvalidations(new ListBinding() { + private final Observable invalidator = cache != null ? cache.getObservable(generic) : getObservable(generic); + { + bind(invalidator); + invalidate(); + } + + @Override + protected ObservableList computeValue() { + return FXCollections.observableList(cache != null ? cache.getDependencies(generic).toList() : Differential.this.getDependencies(generic).toList()); + } + })); + dependenciesAsOservableListCacheMap.put(generic, result); + } + return result; } }; }