http://www.codingpedia.org/ama/how-to-make-parallel-calls-in-java-with-completablefuture-example
Save up to a workweek a year by efficiently managing your dev bookmarks, on www.bookmarks.dev. Share your favorites with the community and they will be published on Github -
Some time ago I wrote how elegant and rapid is to make parallel calls in NodeJS with async-await and Promise.all capabilities. Well, it turns out in Java is just as elegant and succinct with the help of CompletableFuture which was introduced in Java 8. To demonstrate that let’s imagine that you need to retrieve a list of ToDos from a REST service, given their Ids. Of course you could iterate through the list of Ids and sequentially call the web service, but it’s much more performant to do it in parallel with asynchronous calls.
Here is the piece of code that might do just that:
import org.codingpedia.example;import javax.inject.Inject;import java.util.List;import java.util.concurrent.CompletableFuture;import java.util.function.Supplier;import java.util.stream.Collectors;public class ParallelCallsDemoService { @Inject RestApiClient restApiClient; public List<ToDo> getToDos(List<String> ids){ List<CompletableFuture<ToDo>> futures = ids.stream() .map(id -> getToDoAsync(id)) .collect(Collectors.toList()); List<ToDo> result = futures.stream() .map(CompletableFuture::join) .collect(Collectors.toList()); return result; } CompletableFuture<ToDo> getToDoAsync(String id){ CompletableFuture<ToDo> future = CompletableFuture.supplyAsync(new Supplier<ToDo>() { @Override public ToDo get() { final ToDo toDo = restApiClient.getToDo(id); return toDo; } }); return future; }}
COPY
Notes:
supplyAsync
method takes a Supplier
which contains the code you want to execute asynchronously - in this case this is where the REST call takes place…futures
in a listjoin()
method - this returns the value of the CompletableFuture when complete, or throws an (unchecked) exception if completed exceptionally.