Sobes.tech
Middle

Porozprávajte o koncepte triedy CompletableFuture.

sobes.tech AI

Odpoveď od AI

CompletableFuture je trieda v Jave 8+ implementujúca rozhrania Future a CompletionStage. Predstavuje asynchrónny výpočet, ktorý môže byť dokončený (alebo zlyhať) v určitom momente v budúcnosti a nad jeho výsledkom je možné vykonávať následné akcie deklaratívne, bez blokovania hlavného vlákna.

Hlavné možnosti:

  • Asynchrónne vykonávanie: Umožňuje spúšťanie úloh v samostatnom vlákne (alebo vláknovom poole).
  • Kompozícia: Môžete spájať viac CompletableFuture, vytvárajúc reťazce závislých akcií.
  • Správa výnimiek: Poskytuje metódy na spracovanie chýb asynchrónnych výpočtov.
  • Neblokujúce operácie: Výsledok alebo výnimka sa spracováva, keď sa future dokončí, bez explicitného get().

Kľúčové metódy:

  • Vytváranie:
    • supplyAsync(Supplier<T> supplier): Spúšťa Supplier asynchrónne a vracia CompletableFuture s jeho výsledkom.
    • runAsync(Runnable runnable): Spúšťa Runnable asynchrónne a vracia CompletableFuture<Void>.
    • completedFuture(T value): Vytvára už dokončený CompletableFuture s danou hodnotou.
  • Transformácia:
    • thenApply(Function<T, U> fn): Aplikuje funkciu na výsledok, keď sa future dokončí.
    • thenAccept(Consumer<T> action): Vykonáva akciu nad výsledkom, keď sa future dokončí.
    • thenRun(Runnable action): Vykonáva akciu, keď sa future dokončí, ignorujúc výsledok.
    • thenCompose(Function<T, CompletionStage<U>> fn): Umožňuje vytváranie reťazcov, kde výsledok jedného future je použitý na vytvorenie iného.
  • Kombinácia:
    • thenCombine(CompletionStage<U> other, BiFunction<T, U, V> fn): Kombinuje výsledky dvoch futures.
    • allOf(CompletableFuture<?>... cfs): Vráti CompletableFuture<Void>, ktorý sa dokončí, keď sa dokončia všetky zadané futures.
    • anyOf(CompletableFuture<?>... cfs): Vráti CompletableFuture<Object>, ktorý sa dokončí, keď sa dokončí ktorýkoľvek z daných futures.
  • Spracovanie výnimiek:
    • exceptionally(Function<Throwable, T> fn): Spracováva výnimku, vracajúc alternatívnu hodnotu.
    • handle(BiFunction<T, Throwable, U> fn): Spracováva ako výsledok, tak výnimku.

Príklad:

// Spustenie asynchrónnej úlohy
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(1000); // Imaginárna dlhá práca
    } catch (InterruptedException e) {
        throw new IllegalStateException(e);
    }
    return "Výsledok asynchrónnej operácie";
});

// Vykonanie akcie po dokončení úlohy (neblokujúce)
future.thenAccept(result -> {
    System.out.println("Získaný výsledok: " + result);
});

// Ešte jedna akcia, ktorá závisí od prvej
future.thenApply(String::toUpperCase)
      .thenAccept(upperCaseResult -> {
          System.out.println("Výsledok veľkými písmenami: " + upperCaseResult);
      });

// Čakanie na všetky úlohy (v reálnych aplikáciách sa zvyčajne vyhýbajú explicitnému get/join)
// future.join();

CompletableFuture je mocný nástroj na písanie reaktívneho a neblokujúceho kódu v Jave, čo výrazne zjednodušuje prácu s asynchrónnosťou v porovnaní s klasickým rozhraním Future.