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 ինտերֆեյսի հետ։