У нас есть асинхронный метод:
public CompletableFuture<OlderCat> asyncGetOlderCat(String catName)
Приведен список кошек:
List<Cat> cats;
Нам нравится создавать массовую операцию, которая приведет к отображению между именем кота и его асинхронным результатом:
public CompletableFuture<Map<String, OlderCat>>
Нам также нравится, что если из asyncGetOlderCat
было сгенерировано исключение, кот не будет добавлен на карту.
Мы читали этот пост , а также этот , и мы придумали этот код:
List<Cat> cats = ...
Map<String, CompletableFuture<OlderCat>> completableFutures = cats
.stream()
.collect(Collectors.toMap(Cat::getName,
c -> asynceGetOlderCat(c.getName())
.exceptionally( ex -> /* null?? */ ))
));
CompletableFuture<Void> allFutures = CompletableFuture
.allOf(completableFutures.values().toArray(new CompletableFuture[completableFutures.size()]));
return allFutures.thenApply(future -> completableFutures.keySet().stream()
.map(CompletableFuture::join) ???
.collect(Collectors.toMap(????)));
Но не ясно, как в allFutures
мы можем получить доступ к имени кошки и как сопоставить OlderCat
и имя кошки.
Можно ли этого достичь?