У меня есть код, который я хотел бы сделать более реактивным, используя RxJava или Proj. Реактор. Я немного борюсь с этим.
Имея список CatalogRequests, некоторые из которых могут быть для одного и того же CatalogItem, но с другим условием (NEW против различных уровней USED), я хочу:
Получить отдельные элементы каталога по их itemId. Данные для всех условий хранятся в одной строке, поэтому мне нужно сделать запрос на один и тот же элемент только один раз.
Когда у меня есть отдельные элементы, просмотрите мой список запросов и выполните некоторую логику, которая преобразует эти запросы с помощью отдельного элемента каталога, который я только что просмотрел.
class CatalogRequest { String itemId; Integer condition; } //class does not look like this, simplified for the question class CatalogItem { Map<Condition, Money> usedPrices; Map<Condition, DateTime> availableDate; } //non reactive code public List<CatalogResponse> fetchResponses(List<CatalogRequest> requests) { List<CatalogItem> items = requests.stream().map(CatalogRequest::getItemId) .distinct() .collect(toList()); List<Optional<CatalogItem>> cachedResults = items.stream() .map (this::fetchItem) .map (CompletableFuture::join) .filter(Optional::isPresent) .collect(toList()); List<CatalogResponse> responses = new ArrayList<>(); requests.forEach( request -> { CatalogResponse response = transformResponse(request, cachedResults.get(request.getItemId()); responses.add(response); }); }