Sobes.tech
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 future užbaigiasi, be aiškaus get().

Pagrindiniai metodai:

  • Kūrimas:
    • supplyAsync(Supplier<T> supplier): Paleidžia Supplier asinchroniškai ir grąžina CompletableFuture su jo rezultatu.
    • runAsync(Runnable runnable): Paleidžia Runnable asinchroniškai ir grąžina CompletableFuture<Void>.
    • completedFuture(T value): Sukuria jau užbaigtą CompletableFuture su nurodyta verte.
  • Transformacija:
    • thenApply(Function<T, U> fn): Taiko funkciją rezultatui, kai future užbaigiasi.
    • thenAccept(Consumer<T> action): Atlieka veiksmą su rezultatu, kai future užbaigiasi.
    • thenRun(Runnable action): Atlieka veiksmą, kai future užbaigiasi, ignoruojant rezultatą.
    • thenCompose(Function<T, CompletionStage<U>> fn): Leidžia kurti grandines, kur vieno future rezultatas naudojamas kito sukūrimui.
  • Kombinacija:
    • thenCombine(CompletionStage<U> other, BiFunction<T, U, V> fn): Sujungia dviejų future rezultatus.
    • allOf(CompletableFuture<?>... cfs): Grąžina CompletableFuture<Void>, kuris užbaigiasi, kai užbaigiami visi perduoti future.
    • anyOf(CompletableFuture<?>... cfs): Grąžina CompletableFuture<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.