Я сейчас немного запутался, поэтому у меня есть метод, который должен возвращать CompletableFuture<List<A>>
внутри метода:
CompletableFuture<List<String>> toReturn = asyncCall().thenApply(....)
.thenCompose(listOfStuff -> convertToList(listOfStuff.stream().map(
key -> asyncCall2(key)
.thenApply(optionalValue -> optionalValue.orElse(null))
).collect(Collectors.toList()));
а convertToList()
просто объединяет фьючерсы, чтобы преобразовать CompletableFuture<List<ComputableFuture<A>>>
в CompletableFuture<List<A>>
В основном мое намерение состоит в том, чтобы отфильтровать нулевые значения, возникающие из optionalValue.orElse(null)
. И было бы легко сделать фильтр, прежде чем собирать все это, чтобы перечислить в последней строке, но если я использую его непосредственно перед .collect
, он работает над CompletableFutures
Я подозреваю, что в моем коде можно много реструктурировать.
РЕДАКТИРОВАТЬ:
private<T> CompletableFuture<List<T>> convertToList(List<CompletableFuture<T>> toConvert) {
return CompletableFuture.allOf(toConvert.toArray(new CompletableFuture[toConvert.size()]))
.thenApply(v -> toConvert.stream()
.map(CompletableFuture::join)
.collect(Collectors.toList())
);
}
Stream.of()
иStream.empty()
? - person akalikin   schedule 21.11.2016.orElse(null)
, тогда вам не нужно тестироватьnull
. Таким образом, тип параметраconvertToList
будетList<CompletableFuture<Optional<T>>>
, и он может просто сделать.filter(Optional::isPresent).map(Optional::get)
послеjoin
… - person Holger   schedule 21.11.2016convertToList
, хотя я хотел бы делать все в одном месте, иconvertToList
может быть универсальной служебной функцией. - person Amir   schedule 21.11.2016List<Option<T>> -> List<T>
? - person Gene Taylor   schedule 22.11.2016