Attaching a callback that processes the result of an asynchronous task and returns a result

User problem: Fetch the order invoice of a certain customer and, afterward, compute the total and sign it.

Relying on blocking get() is not very useful for such problems. What we need is a callback method that will be automatically called when the result of CompletableFuture is available.

So, we don't want to wait for the result. When the invoice is ready (this is the result of  CompletableFuture), a callback method should compute the total value, and, afterward, another callback should sign it. This can be achieved via the thenApply() method.

The thenApply() method is useful for processing and transforming the result of  CompletableFuture when it arrives. It takes  Function<T, R> as an argument. Let's see it at work:

public static void fetchInvoiceTotalSign() {

CompletableFuture<String> cfFetchInvoice
= CompletableFuture.supplyAsync(() -> {

logger.info(() -> "Fetch invoice by: "
+ Thread.currentThread().getName());
Thread.sleep(500);

return "Invoice #3344";
});

CompletableFuture<String> cfTotalSign = cfFetchInvoice
.thenApply(o -> o + " Total: $145")
.thenApply(o -> o + " Signed");

String result = cfTotalSign.get();
logger.info(() -> "Invoice: " + result + " ");
}

Or, we can chain it as follows:

public static void fetchInvoiceTotalSign() {

CompletableFuture<String> cfTotalSign
= CompletableFuture.supplyAsync(() -> {

logger.info(() -> "Fetch invoice by: "
+ Thread.currentThread().getName());
Thread.sleep(500);

return "Invoice #3344";
}).thenApply(o -> o + " Total: $145")
.thenApply(o -> o + " Signed");

String result = cfTotalSign.get();
logger.info(() -> "Invoice: " + result + " ");
}
Check also applyToEither() and applyToEitherAsync(). When either this or the other given stage completes in a normal way, these two methods return a new completion stage that is executed with the result as an argument to the supplied function.
..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.145.50.222