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 + " ");
}