Middle
CompletableFuture sinfinin konsepti haqqında danışın.
sobes.tech Süni İntellekt
AI-dan cavab
CompletableFuture Java 8+ sinifidir və Future və CompletionStage interfeyslerini həyata keçirir. Bu, gələcəkdə müəyyən bir zamanda tamamlanacaq (və ya səhv verəcək) asinxron hesablamanı təmsil edir və nəticə üzərində ardıcıl əməliyyatları deklarativ şəkildə yerinə yetirməyə imkan verir, əsas axını bloklamadan.
Əsas imkanlar:
- Asinxron icra: Tapşırıqları ayrı bir iş parçacığında (və ya iş parçacığı hovuzunda) başlatmağa imkan verir.
- Kompozisiya: Bir neçə
CompletableFuture-u birləşdirərək asılı əməliyyat zəncirləri yarada bilərsiniz. - Xəta idarəetməsi: Asinxron hesablamalarda səhvləri idarə etmək üçün metodlar təqdim edir.
- Bloklamadan əməliyyatlar: Nəticə və ya istisna, future tamamlandıqda, açıq şəkildə gözləmədən (
get()) işlənir.
Əsas metodlar:
- Yaradıcılıq:
supplyAsync(Supplier<T> supplier): BirSupplier-ı asinxron şəkildə icra edir və onun nəticəsi iləCompletableFutureqaytarır.runAsync(Runnable runnable): BirRunnable-ı asinxron şəkildə icra edir vəCompletableFuture<Void>qaytarır.completedFuture(T value): Artıq tamamlanmış, verilmiş dəyər iləCompletableFutureyaradır.
- Transformasiya:
thenApply(Function<T, U> fn): Nəticəyə funksiyanı tətbiq edir, zaman future tamamlanır.thenAccept(Consumer<T> action): Nəticə tamamlandıqda bir əməliyyat yerinə yetirir.thenRun(Runnable action): Nəticəni nəzərə almadan, tamamlandıqda əməliyyat yerinə yetirir.thenCompose(Function<T, CompletionStage<U>> fn): Zəncirlər qurmağa imkan verir, burada bir future-un nəticəsi başqa birinin yaradılmasında istifadə olunur.
- Birleştirme:
thenCombine(CompletionStage<U> other, BiFunction<T, U, V> fn): İki future-un nəticələrini birləşdirir.allOf(CompletableFuture<?>... cfs): Verilən bütün future-lər tamamlandıqda tamamlananCompletableFuture<Void>qaytarır.anyOf(CompletableFuture<?>... cfs): Hər hansı biri tamamlandıqda tamamlananCompletableFuture<Object>qaytarır.
- Xəta idarəetməsi:
exceptionally(Function<Throwable, T> fn): Xətaları idarə edir və alternativ dəyər qaytarır.handle(BiFunction<T, Throwable, U> fn): Həm nəticəni, həm də istisnayı idarə edir.
Nümunə:
// Asinxron tapşırıq başlat
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000); // Uzun işin simulyasiyası
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
return "Asinxron əməliyyatın nəticəsi";
});
// Tapşırıq tamamlandıqdan sonra əməliyyat yerinə yetir (bloklamadan)
future.thenAccept(result -> {
System.out.println("Alınan nəticə: " + result);
});
// Bir digər əməliyyat, ilkindən asılı
future.thenApply(String::toUpperCase)
.thenAccept(upperCaseResult -> {
System.out.println("Böyük hərflərlə nəticə: " + upperCaseResult);
});
// Bütün tapşırıqların tamamlanmasını gözləmək (əsl tətbiqlərdə adətən açıq `get/join` istifadə etməmək tövsiyə olunur)
// future.join();
CompletableFuture Java-da reaktiv və bloklamayan kod yazmaq üçün güclü bir vasitədir və asinxronluq ilə işləmək işini klassik Future-ə nisbətən əhəmiyyətli dərəcədə sadələşdirir.