Middle
Pastāstiet par klasei CompletableFuture.
sobes.tech AI
Atbilde no AI
CompletableFuture ir Java 8+ klases, kas realizē Future un CompletionStage interfeisus. Tā pārstāv asenkrono aprēķinu, kurš var tikt pabeigts (vai izraisīt kļūdu) nākotnē, un uz rezultāta var veikt turpmākas darbības deklaratīvi, bez galvenā pavediena bloķēšanas.
Galvenās iespējas:
- Asinhrona izpilde: ļauj palaist uzdevumus atsevišķā pavedienā (vai pavedienu grozā).
- Kompozīcija: var apvienot vairākus
CompletableFuture, veidojot atkarīgu darbību ķēdes. - Izņēmumu pārvaldība: nodrošina metodes kļūdu apstrādei asinhronajos aprēķinos.
- Neobligājošas operācijas: rezultāts vai izņēmums tiek apstrādāts, kad future tiek pabeigts, bez tiešas gaidīšanas (
get()).
Galvenās metodes:
- Izveide:
supplyAsync(Supplier<T> supplier): palaista Supplier asinhroni un atgriežCompletableFuturear tā rezultātu.runAsync(Runnable runnable): palaista Runnable asinhroni un atgriežCompletableFuture<Void>.completedFuture(T value): izveido jau pabeigtuCompletableFuturear norādīto vērtību.
- Pārveidošana:
thenApply(Function<T, U> fn): piemēro funkciju, kad future tiek pabeigts.thenAccept(Consumer<T> action): veic darbību ar rezultātu, kad future tiek pabeigts.thenRun(Runnable action): veic darbību, kad future tiek pabeigts, ignorējot rezultātu.thenCompose(Function<T, CompletionStage<U>> fn): ļauj veidot ķēdes, kur viena future rezultāts tiek izmantots, lai izveidotu citu.
- Kombinācija:
thenCombine(CompletionStage<U> other, BiFunction<T, U, V> fn): apvieno divu future rezultātus.allOf(CompletableFuture<?>... cfs): atgriežCompletableFuture<Void>, kas pabeidzas, kad visi norādītie future ir pabeigti.anyOf(CompletableFuture<?>... cfs): atgriežCompletableFuture<Object>, kas pabeidzas, kad pabeidzas jebkurš no norādītajiem future.
- Izņēmumu apstrāde:
exceptionally(Function<Throwable, T> fn): apstrādā izņēmumu, atgriežot alternatīvu vērtību.handle(BiFunction<T, Throwable, U> fn): apstrādā gan rezultātu, gan izņēmumu.
Piemērs:
// Asinhronas uzdevuma uzsākšana
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000); // Ilgstošas darba imitācija
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
return "Asinhronas operācijas rezultāts";
});
// Darbības veikšana pēc uzdevuma pabeigšanas (neblokējot)
future.thenAccept(result -> {
System.out.println("Saņemtais rezultāts: " + result);
});
// Vēl viena darbība, kas ir atkarīga no pirmās
future.thenApply(String::toUpperCase)
.thenAccept(upperCaseResult -> {
System.out.println("Rezultāts lielajiem burtiem: " + upperCaseResult);
});
// Visu uzdevumu gaidīšana (reālos lietojumos parasti izvairās no tiešas `get`/`join`)
// future.join();
CompletableFuture ir jaudīgs rīks reaktīvā un neblokējošā koda rakstīšanai Java, ievērojami vienkāršojot darbu ar asinhronitāti salīdzinājumā ar klasisko Future interfeisu.