Future – интерфейс, который представляет пока еще недовычисленный результат. Когда породившая его асинхронная операция заканчивается, он заполняется значением. Метод
get блокирует выполнение до получения результата,
isDone проверяет его наличие. К примеру результат
выполнения задач в
ExecutorService,
ForkJoinTask, реализует интерфейс
Future.
CompletableFuture появился в Java 8. Это класс-реализация старого интерфейса
Future, а значит всё сказанное выше справедливо и для него. Вдобавок к этому,
CompletableFuture реализует работу с отложенными результатами посредством коллбэков. Метод
thenApply регистрирует код обработки значения, который будет автоматически вызван позже, когда это значение появится.
В Java 9 прогресс пошел дальше, и появилась библиотека
Flow API. Это встроенная реализация реактивных стримов. Реактивный стрим, сильно упрощая, – это более общий случай, последовательность отложенных значений. Другая их реализация – популярная, но не входящая в стандарт библиотека
Reactive Extensions (RxJava).