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
CompletableFuturedo ř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íSupplierasynchronně a vracíCompletableFutures jeho výsledkem.runAsync(Runnable runnable): SpouštíRunnableasynchronně a vracíCompletableFuture<Void>.completedFuture(T value): Vytváří již dokončenýCompletableFutures 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.