Middle
Papaskokite apie CompletableFuture klasės koncepciją.
sobes.tech AI
Atsakymas iš AI
CompletableFuture yra Java 8+ klasė, įgyvendinanti Future ir CompletionStage sąsajas. Ji reprezentuoja asinchroninį skaičiavimą, kuris gali būti užbaigtas (arba sukelti klaidą) ateityje, ir ant jo rezultato galima deklaratyviai vykdyti tolesnius veiksmus, nesustabdant pagrindinio srauto.
Pagrindinės galimybės:
- Asinchroninis vykdymas: Leidžia paleisti užduotis atskirame sraute (arba srautų baseine).
- Kompozicija: Galite sujungti kelis
CompletableFuture, kurdami priklausomų veiksmų grandines. - Klaidų valdymas: Pateikia metodus klaidų apdorojimui asinchroniniuose skaičiavimuose.
- Neblokuojančios operacijos: Rezultatas arba išimtis apdorojama, kai
futureužbaigiasi, be aiškausget().
Pagrindiniai metodai:
- Kūrimas:
supplyAsync(Supplier<T> supplier): PaleidžiaSupplierasinchroniškai ir grąžinaCompletableFuturesu jo rezultatu.runAsync(Runnable runnable): PaleidžiaRunnableasinchroniškai ir grąžinaCompletableFuture<Void>.completedFuture(T value): Sukuria jau užbaigtąCompletableFuturesu nurodyta verte.
- Transformacija:
thenApply(Function<T, U> fn): Taiko funkciją rezultatui, kaifutureužbaigiasi.thenAccept(Consumer<T> action): Atlieka veiksmą su rezultatu, kaifutureužbaigiasi.thenRun(Runnable action): Atlieka veiksmą, kaifutureužbaigiasi, ignoruojant rezultatą.thenCompose(Function<T, CompletionStage<U>> fn): Leidžia kurti grandines, kur vienofuturerezultatas naudojamas kito sukūrimui.
- Kombinacija:
thenCombine(CompletionStage<U> other, BiFunction<T, U, V> fn): Sujungia dviejųfuturerezultatus.allOf(CompletableFuture<?>... cfs): GrąžinaCompletableFuture<Void>, kuris užbaigiasi, kai užbaigiami visi perduotifuture.anyOf(CompletableFuture<?>... cfs): GrąžinaCompletableFuture<Object>, kuris užbaigiasi, kai užbaigiamas bet kuris iš perduotųfuture.
- Klaidų apdorojimas:
exceptionally(Function<Throwable, T> fn): Apdoroja išimtį, grąžindama alternatyvią reikšmę.handle(BiFunction<T, Throwable, U> fn): Apdoroja tiek rezultatą, tiek išimtį.
Pavyzdys:
// Asinchroninio užduoties paleidimas
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000); // Ilgo darbo imitacija
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
return "Asinchroninio operacijos rezultatas";
});
// Veiksmų vykdymas po užduoties užbaigimo (neblokiruojant)
future.thenAccept(result -> {
System.out.println("Gautas rezultatas: " + result);
});
// Kitas veiksmas, priklausomas nuo pirmojo
future.thenApply(String::toUpperCase)
.thenAccept(upperCaseResult -> {
System.out.println("Rezultatas didžiosiomis raidėmis: " + upperCaseResult);
});
// Laukti visų užduočių (realiuose taikymuose dažniausiai vengia aiškaus `get()`/`join()`)
// future.join();
CompletableFuture yra galingas įrankis rašyti reaktyvų ir neblokiruojantį kodą Java, žymiai supaprastinantis darbą su asinchroniškumu, palyginti su klasikiniu Future interfeisu.