Sobes.tech
Middle

Povězte o konceptu třídy CompletableFuture.

sobes.tech AI

Odpověď od AI

CompletableFuture je třída v jazyce Java 8+ implementující rozhraní Future a CompletionStage. Představuje asynchronní výpočet, který může být dokončen (nebo selže) v budoucnu a nad jeho výsledkem lze deklarativně provádět následné akce, aniž by došlo k blokování hlavního vlákna.

Hlavní funkce:

  • Asynchronní provádění: Umožňuje spouštět úlohy v samostatném vlákně (nebo vláknové poolu).
  • Kompozice: Lze spojovat více CompletableFuture do řetězců závislých akcí.
  • Správa výjimek: Poskytuje metody pro zpracování chyb asynchronních výpočtů.
  • Neblokující operace: Výsledek nebo výjimka jsou zpracovány, když se future dokončí, bez explicitního get().

Klíčové metody:

  • Vytváření:
    • supplyAsync(Supplier<T> supplier): Spouští Supplier asynchronně a vrací CompletableFuture s jeho výsledkem.
    • runAsync(Runnable runnable): Spouští Runnable asynchronně a vrací CompletableFuture<Void>.
    • completedFuture(T value): Vytváří již dokončený CompletableFuture s danou hodnotou.
  • Transformace:
    • thenApply(Function<T, U> fn): Aplikuje funkci na výsledek, když se future dokončí.
    • thenAccept(Consumer<T> action): Provádí akci nad výsledkem, když se future dokončí.
    • thenRun(Runnable action): Provádí akci, když se future dokončí, ignoruje výsledek.
    • thenCompose(Function<T, CompletionStage<U>> fn): Umožňuje vytvářet řetězce, kde výsledek jednoho future je použit k vytvoření jiného.
  • Kombinace:
    • thenCombine(CompletionStage<U> other, BiFunction<T, U, V> fn): Kombinuje výsledky dvou futures.
    • allOf(CompletableFuture<?>... cfs): Vrací CompletableFuture<Void>, který se dokončí, když se dokončí všechny předané futures.
    • anyOf(CompletableFuture<?>... cfs): Vrací CompletableFuture<Object>, který se dokončí, když se dokončí kterýkoli z předaných futures.
  • Zpracování výjimek:
    • exceptionally(Function<Throwable, T> fn): Zpracovává výjimku a vrací alternativní hodnotu.
    • handle(BiFunction<T, Throwable, U> fn): Zpracovává jak výsledek, tak výjimku.

Příklad:

// Spuštění asynchronní úlohy
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(1000); // Simulace dlouhé práce
    } catch (InterruptedException e) {
        throw new IllegalStateException(e);
    }
    return "Výsledek asynchronní operace";
});

// Provádění akce po dokončení úlohy (neblokující)
future.thenAccept(result -> {
    System.out.println("Získaný výsledek: " + result);
});

// Další akce závislá na prvním
future.thenApply(String::toUpperCase)
      .thenAccept(upperCaseResult -> {
          System.out.println("Výsledek ve velkých písmenech: " + upperCaseResult);
      });

// Čekání na všechny úlohy (v reálných aplikacích se obvykle vyhýbají explicitnímu get/join)
// future.join();

CompletableFuture je mocný nástroj pro psaní reaktivního a neblokujícího kódu v Javě, což výrazně zjednodušuje práci s asynchronností ve srovnání s klasickým rozhraním Future.