diff --git a/desktop/src/main/java/bisq/desktop/main/dao/economy/supply/SupplyView.java b/desktop/src/main/java/bisq/desktop/main/dao/economy/supply/SupplyView.java index 47723fadd2..87372ba4ea 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/economy/supply/SupplyView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/economy/supply/SupplyView.java @@ -78,8 +78,10 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.Spliterators.AbstractSpliterator; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiFunction; import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -601,6 +603,11 @@ public class SupplyView extends ActivatableView implements DaoSt } private void updateBSQIssuedMonthly() { + Function blockTimeFn = memoize(height -> + Instant.ofEpochMilli(daoFacade.getBlockTime(height)).atZone(ZoneId.systemDefault()) + .toLocalDate() + .with(ADJUSTERS.get(MONTH))); + Stream bsqByCompensation = daoStateService.getIssuanceSet(IssuanceType.COMPENSATION).stream() .sorted(Comparator.comparing(Issuance::getChainHeight)); @@ -608,10 +615,7 @@ public class SupplyView extends ActivatableView implements DaoSt .sorted(Comparator.comparing(Issuance::getChainHeight)); Map> bsqAddedByVote = Stream.concat(bsqByCompensation, bsqByReimbursement) - .collect(Collectors.groupingBy(item -> Instant.ofEpochMilli(daoFacade.getBlockTime(item.getChainHeight())) - .atZone(ZoneId.systemDefault()) - .toLocalDate() - .with(ADJUSTERS.get(MONTH)))); + .collect(Collectors.groupingBy(blockTimeFn.compose(Issuance::getChainHeight))); List> updatedAddedBSQ = bsqAddedByVote.keySet().stream() .map(date -> { @@ -701,4 +705,9 @@ public class SupplyView extends ActivatableView implements DaoSt }; return StreamSupport.stream(spliterator, false); } + + private static Function memoize(Function fn) { + Map map = new ConcurrentHashMap<>(); + return x -> map.computeIfAbsent(x, fn); + } }