thenApply ve thenCompose ile Zincirleme
Sonuçları thenApply ile dönüştürün ve iç içe geçmiş geleceklerden kaçınmak için eşzamansız adımları thenCompose ile flatMap edin.
thenApply ve thenCompose ile Zincirleme, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
thenApply: Sonucu Dönüştürme
thenApply(Function), tamamlanmış bir geleceğin sonucuna eşzamanlı bir işlev uygular ve dönüştürülmüş türde yeni bir gelecek döndürür. Yeni bir eşzamansız görev başlatmaz.
CompletableFuture<String> nameFuture = CompletableFuture
.supplyAsync(() -> 42L) // CF<Long>
.thenApply(id -> "User#" + id); // CF<String>
System.out.println(nameFuture.join()); // "User#42"thenApplyAsync: Bir İş Parçacığında Dönüştürme
thenApplyAsync, dönüştürme işlevini ForkJoinPool üzerinde (veya sağlanan bir yürütücüyle) çalıştırarak tamamlamayı yapan iş parçacığını hemen serbest bırakır.
CompletableFuture<String> result = fetchUserAsync()
.thenApplyAsync(user -> serialize(user)); // runs on pool threadthenAccept: Döndürmeden Tüketme
thenAccept(Consumer), sonucu işler ancak CompletableFuture<Void> döndürür. İleride bir değer aktarmanız gerekmediğinde işlem hattının son adımı olarak kullanın.
fetchUserAsync()
.thenApply(User::getName)
.thenAccept(name -> System.out.println("Hello, " + name));thenRun: Tamamlanmadan Sonra Çalıştırma
thenRun(Runnable), sonucu yok sayarak gelecek tamamlandıktan sonra bir görev çalıştırır. Kaynakları kapatmak veya yan etkileri tetiklemek için uygundur.
downloadFileAsync(url)
.thenRun(() -> System.out.println("Download complete"));Birden Çok thenApply Çağrısını Zincirleme
Birden çok thenApply çağrısı bir işlem hattı oluşturur. Her adım, önceki adımın çıktısını alır.
CompletableFuture<Double> result = CompletableFuture
.supplyAsync(() -> " 42.5 ")
.thenApply(String::trim)
.thenApply(Double::parseDouble)
.thenApply(d -> d * 1.21); // apply 21% VAT
System.out.println(result.join()); // 51.425thenCompose: İç İçe Gelecekleri Düzleştirme
thenCompose(Function<T, CompletionStage<U>>), gelecekler için flatMap gibidir. İç içe geleceği düzleştirerek CompletableFuture<CompletableFuture<T>> oluşmasını önler.
// Wrong with thenApply — returns CF<CF<Order>>:
CompletableFuture<CompletableFuture<Order>> nested =
fetchUser(id).thenApply(u -> fetchLatestOrder(u.getId()));
// Correct with thenCompose — returns CF<Order>:
CompletableFuture<Order> flat =
fetchUser(id).thenCompose(u -> fetchLatestOrder(u.getId()));Sıralı Eşzamansız Çağrılar için thenCompose
Her eşzamansız adım önceki adımın sonucuna bağlı olduğunda thenCompose kullanın; böylece adımlar sıralı ve sonuca bağlı olur.
fetchUser(userId)
.thenCompose(user -> fetchOrders(user.getId()))
.thenCompose(orders -> computeTotal(orders))
.thenAccept(total -> System.out.println("Total: " + total));thenApply ve thenCompose Karşılaştırması
thenApply: T -> U eşlemesi yapar (eşzamanlı dönüştürme). thenCompose: T -> CompletableFuture<U> eşlemesi yapar ve sonucu düzleştirir. Sonraki adım da eşzamansız olduğunda compose kullanın.
Ara Hataları handle ile Yönetme
handle(BiFunction<T, Throwable, U>), gelecek normal veya istisnai biçimde tamamlanmış olsa da çağrılır; bu sayede işlem hattının ortasındaki hataları kurtarmaya veya dönüştürmeye olanak tanır.
fetchUser(id)
.thenApply(User::getProfile)
.handle((profile, ex) -> {
if (ex != null) return Profile.empty(); // recover
return profile;
})
.thenAccept(System.out::println);whenComplete: Her Sonuçtan Sonra Yan Etki
whenComplete(BiConsumer), günlükleme veya temizleme için tamamlanmadan sonra (normal ya da istisnai biçimde) çağrılır. handle'dan farklı olarak sonucu değiştirmez.
fetchAsync()
.whenComplete((result, ex) -> {
if (ex != null) log.error("Failed", ex);
else log.info("Result: " + result);
});Engellemesiz İşlem Hattı Örneği
Tamamen engellemesiz bir işlem hattı oluşturun: kullanıcıyı getirin, siparişlerini getirin ve özeti hesaplayın; tüm adımlar eşzamansız çalışsın ve her biri bir önceki adıma bağlı olsun.
CompletableFuture<String> summary =
fetchUser(userId)
.thenCompose(u -> fetchOrders(u.getId()))
.thenApply(orders -> orders.size() + " orders")
.exceptionally(ex -> "Error: " + ex.getMessage());
System.out.println(summary.join());Kısa Sınama
thenApply yerine ne zaman thenCompose kullanmalısınız?
Özet
thenApply, bir işlem hattındaki eşzamanlı değerleri dönüştürür. thenCompose, eşzamansız adımları zincirler (gelecekler için flatMap). handle / whenComplete, hata yönetimi ve yan etkiler ekler. Okunabilirlik için işlem hatlarını soldan sağa oluşturun.
Sıkça Sorulan Sorular
“thenApply ve thenCompose ile Zincirleme” dersi ücretsiz mi?
Evet — “thenApply ve thenCompose ile Zincirleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“thenApply ve thenCompose ile Zincirleme” dersinde ne öğreneceğim?
Sonuçları thenApply ile dönüştürün ve iç içe geçmiş geleceklerden kaçınmak için eşzamansız adımları thenCompose ile flatMap edin. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“thenApply ve thenCompose ile Zincirleme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- CompletableFutures Oluşturma ve Tamamlama
- thenApply ve thenCompose ile Zincirleme
- Gelecekleri Birleştirme: allOf ve anyOf
- Hata İşleme ve Eşzamansız HTTP İş Akışı