Logo

dev-resources.site

for different kinds of informations.

This Week I Learnt: Java's CompletableFuture

Published at
7/31/2024
Categories
java
asynchronous
backend
Author
daraolayebi
Categories
3 categories in total
java
open
asynchronous
open
backend
open
Author
11 person written this
daraolayebi
open
This Week I Learnt: Java's CompletableFuture

This week, I'm diving into Java's CompletableFuture.

As a full-stack developer with a frontend background, dealing with asynchronous tasks is an inevitable part of my role – network requests, background computations, and the like. In Java, CompletableFuture is a powerful tool for handling these tasks while keeping the main thread responsive.

Completable futures are to Java what Promises are to JavaScript.

If you're familiar with JavaScript, it might help to grasp these concepts by making parallels between both languages. I like to think of CompletableFuture as Java's version of a Promise. It is a class that represents the eventual result of an asynchronous operation, whether that result is a success or failure. Introduced in Java 8 as part of the java.util.concurrent package, it's a powerful way of writing non-blocking code, with methods for chaining operations, and handling errors, similarly to Promises.

Here's a quick comparison of the two:

// JavaScript Promise
fetchFromServer()
    .then(data => processData(data))
    .then(result => updateUI(result))
    .catch(error => handleError(error));
Enter fullscreen mode Exit fullscreen mode
// Java CompletableFuture
CompletableFuture.supplyAsync(() -> fetchDataFromServer())
    .thenApply(data -> processData(data))
    .thenAccept(result -> updateUI(result))
    .exceptionally(error -> handleError(error));
Enter fullscreen mode Exit fullscreen mode

As illustrated above, CompletableFuture provides a similar, chainable syntax that allows for clean and readable asynchronous code.

Consider a scenario where you need to fetch a user's profile data and order history from two separate endpoints. You would want to avoid freezing the UI while waiting for these requests to complete. Here's how you would implement this using CompletableFuture:

CompletableFuture<User> profileFuture = CompletableFuture.supplyAsync(() -> {
    // Fetch user profile from a service
});

CompletableFuture<List<Order>> ordersFuture = CompletableFuture.supplyAsync(() -> {
    // Fetch user orders from another service
});

CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(profileFuture, ordersFuture);

combinedFuture.thenRun(() -> {
    User user = userFuture.join(); 
    List<Order> orders = ordersFuture.join(); 
    displayUserData(user, orders); 
});
Enter fullscreen mode Exit fullscreen mode

In this example, we trigger two asynchronous requests simultaneously and use allOf to wait for both to finish. Once they complete, we retrieve the results and update the UI accordingly, all without blocking the main thread.


Chaining & CompletionStage

CompletableFuture implements the CompletionStage interface, which provides the foundation for chaining operations. Each thenApply, thenAccept, and similar method returns another CompletionStage, allowing you to create complex asynchronous pipelines.

Similar to how we can chain promises in JavaScript when we have a sequence of asynchronous tasks to be performed one after another, we can chain tasks within a Completable Future in order to create a sequence of dependent asynchronous operations without falling into callback hell. Here's how we would do that:

CompletableFuture.supplyAsync(() -> "Hello")
    .thenApply(result -> result + ", CompletableFuture")
    .thenApply(result -> result + " in Java")
    .thenAccept(System.out::println);
Enter fullscreen mode Exit fullscreen mode

Handling exceptions

Where we have .catch() on a Promise object, we have .exceptionally() on a Completable Future. This method handles exceptions that may occur during asynchronous processing:

CompletableFuture.supplyAsync(() -> {
    if (true) {
        throw new RuntimeException("Exception in CompletableFuture!");
    }
    return "No exception";
}).exceptionally(ex -> {
    System.out.println("Handled exception: " + ex);
    return "Recovered value";
}).thenAccept(System.out::println);
Enter fullscreen mode Exit fullscreen mode

I hope this article gives you a good starting point to explore the CompletableFuture class further.

Helpful Links:

asynchronous Article's
30 articles in total
Favicon
Why is My Multi-Threaded API Still Slow?
Favicon
Building Async APIs in ASP.NET Core - The Right Way
Favicon
Understanding Synchronous and Asynchronous Bus Timing
Favicon
Async Vs Sync, which is most preferrable?
Favicon
Mastering Asynchronous Programming in JavaScript
Favicon
Why Modern Programming Isn't Always Asynchronous (And That's Okay, Mostly)
Favicon
Zero-Cost Abstractions in Rust: Asynchronous Programming Without Breaking a Sweat
Favicon
Why Wait? Exploring Asynchronous and Non-Blocking Programming 🚦
Favicon
The Tale of Async, Multithread, and Parallel: Heroes of the .NET Realm
Favicon
Getting Started with Asynchronous Programming in Dart
Favicon
JavaScript Event Loop
Favicon
Asynchronous programming in Javascript
Favicon
This Week I Learnt: Java's CompletableFuture
Favicon
How to Run a Method Asynchronously in a Reactive Chain in Spring WebFlux?
Favicon
Programación asincrónica en Javascript
Favicon
Understanding the Event Loop, Callback Queue, and Call Stack & Micro Task Queue in JavaScript
Favicon
Mastering Callbacks in JavaScript 💻🔥
Favicon
Mastering Concurrency in C with Pthreads: A Comprehensive Guide
Favicon
Async/Await keeps order in JavaScript;
Favicon
Rate my python async snippet
Favicon
Returning a Promise — How an async function operates
Favicon
A Project of async springboot and react js from where i can learn please help...
Favicon
GPT teaches me how to make my logic sync and async at the same time with trampolines
Favicon
Understanding JavaScript Promises and Callbacks
Favicon
Pros and Cons of Event-Driven Architecture
Favicon
Asynchronous Communication with Apache Kafka
Favicon
Dig deeper into JavaScript.
Favicon
Is async/await a good idea? 🤔 async/await vs promises
Favicon
What is RabbitMQ and why do you need a Message Broker?
Favicon
🍳 Asynchronous Programming in C# Made Easy: Breakfast Included! ☕️

Featured ones: