What is CompletableFuture’s equivalent of flatMap?

There’s a bug in its documentation, but the CompletableFuture#thenCompose family of methods is the equivalent of a flatMap. Its declaration should also give you some clues

public <U> CompletableFuture<U> thenCompose(Function<? super T,? extends CompletionStage<U>> fn)

thenCompose takes the result of the receiver CompletableFuture (call it 1) and passes it to the Function you provide, which must return its own CompletableFuture (call it 2). The CompletableFuture (call it 3) returned by thenCompose will be completed when 2 completes.

In your example

CompletableFuture<Worker> one = CompletableFuture.supplyAsync(this::getPhantom, threadPool);
CompletableFuture<PdfMessage /* whatever */> two = one.thenCompose(worker -> worker.convert(htmlMessage));
CompletableFuture<byte[]> result = two.thenApply(pdfMessage -> Base64.getDecoder().decode(pdfMessage.getEncodedContent()));

Leave a Comment