I have this weird type CompletableFuture<CompletableFuture<byte[]>>
but i want CompletableFuture<byte[]>
. Is this possible?
public Future<byte[]> convert(byte[] htmlBytes) { PhantomPdfMessage htmlMessage = new PhantomPdfMessage(); htmlMessage.setId(UUID.randomUUID()); htmlMessage.setTimestamp(new Date()); htmlMessage.setEncodedContent(Base64.getEncoder().encodeToString(htmlBytes)); CompletableFuture<CompletableFuture<byte[]>> thenApply = CompletableFuture.supplyAsync(this::getPhantom, threadPool).thenApply( worker -> worker.convert(htmlMessage).thenApply( pdfMessage -> Base64.getDecoder().decode(pdfMessage.getEncodedContent()) ) ); }
thenCompose() is better for chaining CompletableFuture. thenApply() is better for transform result of Completable future. You can achieve your goal using both techniques, but one is more suitable for one use case then other.
CompletableFuture is used for asynchronous programming in Java. Asynchronous programming is a means of writing non-blocking code by running a task on a separate thread than the main application thread and notifying the main thread about its progress, completion or failure.
runAsync. Returns a new CompletableFuture that is asynchronously completed by a task running in the given executor after it runs the given action.
Future transferes single value using synchronous interface. CompletableFuture transferes single value using both synchronous and asynchronous interfaces. Rx transferes multiple values using asynchronous interface with backpressure.
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()));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With