- При использовании thenApply() выходные данные показывают вложенные фьючерсы, и вызов не ждет завершения внутреннего асинхронного вычисления.
- При использовании thenCompose() результат корректно выравнивается, и окончательный результат get() возвращает ожидаемые данные.
public class CompletableFutureExample {
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newFixedThreadPool(2);
CompletableFuture future = CompletableFuture.supplyAsync(() -> {
System.out.println(Thread.currentThread().getName() + " - Fetching user");
sleep(1000);
return "User123";
}, executor);
CompletableFuture result1 = future.thenApply(user -> fetchUserDetails(user, executor));
CompletableFuture result2 = future.thenCompose(user -> fetchUserDetailsAsync(user, executor));
System.out.println("Result1: " + result1.get()); // (1)
System.out.println("Result2: " + result2.get()); // (2)
executor.shutdown();
}
static String fetchUserDetails(String user, ExecutorService executor) {
System.out.println(Thread.currentThread().getName() + " - Fetching details for " + user);
sleep(500);
return "Details of " + user;
}
static CompletableFuture fetchUserDetailsAsync(String user, ExecutorService executor) {
return CompletableFuture.supplyAsync(() -> {
System.out.println(Thread.currentThread().getName() + " - Fetching async details for " + user);
sleep(500);
return "Async details of " + user;
}, executor);
}
static void sleep(long ms) {
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... enapply-vs
Мобильная версия