Sobes.tech
Middle

გთხოვთ, ისაუბროთ კლასის CompletableFuture კონცეფციაზე.

sobes.tech AI

პასუხი AI-სგან

CompletableFuture — դա Java 8+ դաս է, որը իրականացնում է Future և CompletionStage ինտերֆեյսները: Այն ներկայացնում է ասինխրոն հաշվարկ, որը կարող է ավարտվել (կամ սխալ տալ) ապագայում և որի արդյունքի վրա կարող եք կատարել հաջորդ գործողություններ դեկլարատիվ կերպով, առանց հիմնական հոսքը բլոկավորելու:

Հիմնական հնարավորություններ՝

  • Ասինխրոն կատարման: Թույլ է տալիս գործառույթներ գործարկել առանձին հոսքում (կամ հոսքերի պուլում):
  • Կոմպոզիցիա: Կարող եք միացնել մի քանի CompletableFuture, ստեղծելով կախված գործողությունների շղթաներ:
  • Անհատականության կառավարում: Պատրաստում է մեթոդներ ասինխրոն հաշվարկների սխալների մշակման համար:
  • Անբլոկային գործողություններ: Արդյունքը կամ սխալը մշակվում է, երբ future-ը ավարտվում է, առանց բացահայտ get()-ի:

Հիմնական ыкмалары:

  • Ստեղծում:
    • supplyAsync(Supplier<T> supplier): Աշխատում է Supplier-ը ասինխրոն և վերադարձնում CompletableFuture-ը նրա արդյունքով:
    • runAsync(Runnable runnable): Աշխատում է Runnable-ը ասինխրոն և վերադարձնում CompletableFuture<Void>:
    • completedFuture(T value): Ստեղծում է արդեն ավարտված CompletableFuture-ը նշված արժեքով:
  • Փոխակերպում:
    • thenApply(Function<T, U> fn): Կիրառում է ֆունկցիա արդյունքի վրա, երբ future ավարտվում է:
    • thenAccept(Consumer<T> action): Կատարում է գործողություն արդյունքի վրա, երբ future ավարտվում է:
    • thenRun(Runnable action): Կատարում է գործողություն, երբ future ավարտվում է, անտեսելով արդյունքը:
    • thenCompose(Function<T, CompletionStage<U>> fn): Ինքնուրույն կառուցում է շղթաներ, որտեղ մեկ future արդյունքը օգտագործվում է մյուսը ստեղծելու համար:
  • Կոմբինացիա:
    • thenCombine(CompletionStage<U> other, BiFunction<T, U, V> fn): Միավորում է երկու future արդյունքները:
    • allOf(CompletableFuture<?>... cfs): Վերադարձնում է CompletableFuture<Void>, որը ավարտվում է, երբ բոլոր փոխանցված future-ները ավարտվեն:
    • anyOf(CompletableFuture<?>... cfs): Վերադարձնում է CompletableFuture<Object>, որը ավարտվում է, երբ ցանկացած փոխանցված future ավարտվի:
  • Սխալների մշակում:
    • exceptionally(Function<Throwable, T> fn): Հաշվարկում է սխալը, վերադարձնելով այլընտրանքային արժեք:
    • handle(BiFunction<T, Throwable, U> fn): Հաշվարկում է ինչպես արդյունքը, այնպես էլ սխալը:

Օրինակ՝

// Ասինխրոն առաջադրանքի գործարկում
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(1000); // Դիտարկում երկար աշխատանք
    } catch (InterruptedException e) {
        throw new IllegalStateException(e);
    }
    return "Ասինխրոն օպերացիայի արդյունք";
});

// Գործողության կատարմամբ հետո ավարտի առաջադրանքը (չբլոկավոր)
future.thenAccept(result -> {
    System.out.println("Արդյունքը ստացվեց՝ " + result);
});

// Այլ գործողություն, որը կախված է առաջինից
future.thenApply(String::toUpperCase)
      .thenAccept(upperCaseResult -> {
          System.out.println("Արդյունքը մեծատառերով՝ " + upperCaseResult);
      });

// Բոլոր առաջադրանքների սպասում (իրական ծրագրերում սովորաբար խուսափում են բացահայտ get/join-ից)
// future.join();

CompletableFuture-ը հզոր գործիք է ռեակցիոն և ոչ բլոկավոր կոդ գրելու համար Java-ում, այն զգալիորեն պարզեցնում է ասինխրոնության հետ աշխատանքը՝ համեմատած դասական Future ինտերֆեյսի հետ։