Sobes.tech
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ž CompletableFuture ar tā rezultātu.
    • runAsync(Runnable runnable): palaista Runnable asinhroni un atgriež CompletableFuture<Void>.
    • completedFuture(T value): izveido jau pabeigtu CompletableFuture ar 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.