Sobes.tech
Middle

Реците о концепту класе CompletableFuture.

sobes.tech АИ

Одговор од АИ

CompletableFuture је класа у Јави 8+ која имплементира интерфејсе Future и CompletionStage. Представља асинхроно израчунавање које може бити завршено (или изазвати грешку) у неком тренутку у будућности и над његовим резултатом могу се извршавати последичне акције декларативно, без блокирања главног тока.

Главне могућности:

  • Асинхроно извршавање: Омогућава покретање задатака у посебном току (или пулу токова).
  • Композиција: Може се спојити више CompletableFuture, креирајући ланце зависних акција.
  • Управљање изузецима: Пружа методе за обраду грешака асинхроних израчунавања.
  • Неблокирајуће операције: Резултат или изузетак се обрађује када се future заврши, без јасног get().

Кључне методе:

  • Креирање:
    • supplyAsync(Supplier<T> supplier): Покреће Supplier асинхроно и враћа CompletableFuture са његовим резултатом.
    • runAsync(Runnable runnable): Покреће Runnable асинхроно и враћа CompletableFuture<Void>.
    • completedFuture(T value): Креира већ завршени CompletableFuture са задатом вредношћу.
  • Преобразба:
    • thenApply(Function<T, U> fn): Примењује функцију на резултат када се future заврши.
    • thenAccept(Consumer<T> action): Извршава акцију над резултатом када се future заврши.
    • thenRun(Runnable action): Извршава акцију када се future заврши, игноришући резултат.
    • thenCompose(Function<T, CompletionStage<U>> fn): Омогућава гранање, где се резултат једног future користи за креирање другог.
  • Комбиновање:
    • thenCombine(CompletionStage<U> other, BiFunction<T, U, V> fn): Комбинује резултате два future.
    • allOf(CompletableFuture<?>... cfs): Враћа CompletableFuture<Void> који се завршава када се сви пренесени futures заврше.
    • anyOf(CompletableFuture<?>... cfs): Враћа CompletableFuture<Object> који се завршава када се заврши било који од пренесених futures.
  • Обрада изузетака:
    • exceptionally(Function<Throwable, T> fn): Обрађује изузетак, враћајући алтернативну вредност.
    • handle(BiFunction<T, Throwable, U> fn): Обрађује како резултат, тако и изузетак.

Пример:

// Покретање асинхронног задатка
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(1000); // Имитација дугог рада
    } catch (InterruptedException e) {
        throw new IllegalStateException(e);
    }
    return "Резултат асинхронске операције";
});

// Извршавање акције након завршетка задатка (не блокирајуће)
future.thenAccept(result -> {
    System.out.println("Добијени резултат: " + result);
});

// Још једна акција која зависи од прве
future.thenApply(String::toUpperCase)
      .thenAccept(upperCaseResult -> {
          System.out.println("Резултат у великој штампи: " + upperCaseResult);
      });

// Чекање на све задатке (у стварним апликацијама обично избегавају јасно get/join)
// future.join();

CompletableFuture је моћан алат за писање реактивног и не блокирајућег кода у Јави, значајно поједностављујући рад са асинхроношћу у поређењу са класичним интерфејсом Future.