ich jetzt in ein wenig Verwirrung bin, so habe ich eine Methode, die CompletableFuture<List<A>>
CompletableFutures und Filterung basierend auf Werten, die im Inneren sind
innerhalb der Methode ist zurückgeben sollte:
CompletableFuture<List<String>> toReturn = asyncCall().thenApply(....)
.thenCompose(listOfStuff -> convertToList(listOfStuff.stream().map(
key -> asyncCall2(key)
.thenApply(optionalValue -> optionalValue.orElse(null))
).collect(Collectors.toList()));
und convertToList()
verbindet einfach Futures zu konvertieren CompletableFuture<List<ComputableFuture<A>>>
in
Grundsätzlich meine Absicht ist Null-Werte filtern, die aus optionalValue.orElse(null)
entstehen Und es wäre einfach, Filter vor coll zu tun Alles in der letzten Zeile auflisten, aber wenn ich es gerade vor .collect
benutze es funktioniert über CompletableFutures
Ich vermute, es gibt eine Menge von Umstrukturierungen, die ich in meinem Code tun kann.
EDIT:
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())
);
}
Verwenden Sie 'Stream.of()' und 'Stream.empty()'? – akalikin
Rufen Sie '.orElse (null)' nicht auf, dann müssen Sie nicht nach 'null' testen. Also wäre der Parametertyp von 'convertToList'' List >> 'und es kann einfach ein' .filter (Optional :: isPresent) .map (Optional :: get) 'nach dem' Join' ... –
Holger
@ Holger ja, es ist eine Option zu filtern (entweder auf Optionals oder Null-Werte) in 'ConvertToList', würde ich gerne alles an einer Stelle tun, und' convertToList' kann eine universelle Dienstprogrammfunktion sein – Amir