public List<ExchangeCurrencyRate> getAllExchangeCurrencyRates(CurrencyType currencyType) { List<ExchangeCurrencyRate> allExchangeCurrencyRates = new ArrayList<>(); getExchangeEntryRates().stream().forEach((exchangeEntryRate) -> { allExchangeCurrencyRates.addAll(exchangeEntryRate.getExchangeCurrencyRates() .stream() .filter((currencyRate) -> currencyRate.getCurrencyType() == currencyType) .collect(Collectors.toList()) ); }); return allExchangeCurrencyRates; }
private boolean checkIfCurrencyIsPresent(List<ExchangeAggregateRate> rates, CurrencyType currencyType) { return rates.stream().anyMatch((aggregateRate) -> { return aggregateRate.getExchangeEntryRates().stream().anyMatch((entry) -> { return entry.getExchangeCurrencyRates().stream().anyMatch((currency) -> { return currency.getCurrencyType() == currencyType; }); }); }); }
protected Optional<BigDecimal> getRateFromHistoricalProviderAndSaveToDB(CurrencyType currencyType, Instant timestamp) { ExchangeEntryRate exchangeEntryRate = getRateFromHistoricalProviderFromAllSupportedCurrencies(timestamp); // create the aggregation object ExchangeAggregateRate aggregateRate = new ExchangeAggregateRate(Date.from(Instant.now()), blockNrProviderService.getCurrentBlockNrEthereum(), blockNrProviderService.getCurrentBlockNrBitcoin()); aggregateRate.addExchangeEntry(exchangeEntryRate); if (exchangeEntryRate.getExchangeCurrencyRates() != null && !exchangeEntryRate.getExchangeCurrencyRates().isEmpty()) { exchangeEntryRate.getExchangeCurrencyRates().stream() .filter(distinctByKey(ExchangeCurrencyRate::getCurrencyType)) .forEach((entry) -> { // get all "ExchangeCurrencyRate" objects of distinct crypto currencies List<ExchangeCurrencyRate> allExchangeCurrencyRates = aggregateRate.getAllExchangeCurrencyRates(entry.getCurrencyType()); // remove outliers and get the mean BigDecimal mean = aggregationService.removeOutliersAndGetMean(allExchangeCurrencyRates); // create a new aggregate currency ExchangeAggregateCurrencyRate aggCurrencyRate = new ExchangeAggregateCurrencyRate(entry.getCurrencyType(), mean); // add to the top-level "ExchangeAggregateRate" aggregateRate.addExchangeAggregateCurrencyRate(aggCurrencyRate); }); // save to DB exchangeAggregateRateRepository.save(aggregateRate); } return aggregateRate.getExchangeAggregateCurrencyRates(currencyType) .map((aggregateObj) -> aggregateObj.getAggregateExchangeRate()); }