Saya tidak bisa memahami perbedaan antara thenApply(
) dan thenCompose()
.
Jadi, dapatkah seseorang memberikan kasus penggunaan yang valid?
Dari dokumen Java:
thenApply(Function<? super T,? extends U> fn)
Mengembalikan yang baru
CompletionStage
, ketika tahapan ini selesai secara normal, dieksekusi dengan hasil tahapan ini sebagai argumen ke fungsi yang disediakan.
thenCompose(Function<? super T,? extends CompletionStage<U>> fn)
Mengembalikan yang baru
CompletionStage
, ketika tahap ini selesai secara normal, dijalankan dengan tahap ini sebagai argumen ke fungsi yang disediakan.
Saya mengerti bahwa argumen ke-2 thenCompose
memperluas CompletionStage di mana thenApply
tidak.
Bisakah seseorang memberikan contoh dalam hal apa saya harus menggunakan thenApply
dan kapan thenCompose
?
map
danflatMap
dalamStream
?thenApply
adalahmap
danthenCompose
adalahflatMap
dariCompletableFuture
. Anda gunakanthenCompose
untuk menghindariCompletableFuture<CompletableFuture<..>>
.map
danflatMap
dan saya mengerti maksud Anda. Terima kasih lagi :)Jawaban:
thenApply
digunakan jika Anda memiliki fungsi pemetaan sinkron.thenCompose
digunakan jika Anda memiliki fungsi pemetaan asinkron (yaitu fungsi yang mengembalikan aCompletableFuture
). Ini kemudian akan mengembalikan masa depan dengan hasil secara langsung, daripada masa depan bersarang.sumber
.thenCompose(x -> CompletableFuture.supplyAsync(() -> x+1))
bukan.thenApplyAsync(x -> x+1)
? Menjadi sinkron atau asinkron bukanlah perbedaan yang relevan.CompletableFuture
, maka ini akan menjadithenCompose
cara untuk meratakan struktur.thenApplyAsync
karena bukan itu yang Anda pikirkan.Saya pikir jawaban yang diposting oleh @Joe C menyesatkan.
Izinkan saya mencoba menjelaskan perbedaan antara
thenApply
danthenCompose
dengan contoh.Misalkan kita memiliki 2 metode:
getUserInfo(int userId)
dangetUserRating(UserInfo userInfo)
:Kedua tipe pengembalian metode tersebut
CompletableFuture
.Kami ingin menelepon
getUserInfo()
dulu, dan setelah selesai, panggilgetUserRating()
dengan hasilUserInfo
.Setelah menyelesaikan
getUserInfo()
metode, mari kita cobathenApply
danthenCompose
. Perbedaannya terletak pada tipe pengembalian:thenCompose()
bekerja seperti ScalaflatMap
yang meratakan masa depan bersarang.thenApply()
mengembalikan masa depan bersarang seperti sebelumnya, tetapithenCompose()
meratakannyaCompletableFutures
sehingga lebih mudah untuk merangkai lebih banyak panggilan metode ke sana.sumber
UserInfo
(maka ya) atau apakah harus diperoleh secara terpisah, bahkan mungkin mahal (lalu tidak).Javadocs yang diperbarui di Java 9 mungkin akan membantu memahaminya dengan lebih baik:
laluLamar
<U> CompletionStage<U> thenApply(Function<? super T,? extends U> fn)
laluCompose
sumber
map
danflatMap
di tempat pertama.thenApply()
hanya akan memanggilFunction.apply()
, danthenCompose()
agak mirip dengan fungsi penulisan.thenApply
danthenCompose
merupakan metodeCompletableFuture
. Gunakan jika Anda berniat melakukan sesuatu untuk mendapatkanCompleteableFuture
hasil dengan aFunction
.thenApply
danthenCompose
keduanya mengembalikanCompletableFuture
sebagai hasil mereka sendiri. Anda dapat merantai beberapathenApply
atauthenCompose
bersama. Berikan aFunction
ke setiap panggilan, yang hasilnya akan menjadi masukan ke panggilan berikutnyaFunction
.Yang
Function
Anda berikan terkadang perlu melakukan sesuatu secara sinkron. Tipe pengembalian AndaFunction
harus non-Future
tipe. Dalam hal ini Anda harus menggunakanthenApply
.Di lain waktu Anda mungkin ingin melakukan pemrosesan asinkron dalam hal ini
Function
. Dalam hal ini Anda harus menggunakanthenCompose
. Jenis pengembalian AndaFunction
harus aCompletionStage
.Function
Rantai berikutnya akan mendapatkan hasilCompletionStage
sebagai masukan, sehingga membuka bungkusCompletionStage
.Ini adalah ide yang mirip dengan Javascript
Promise
.Promise.then
dapat menerima fungsi yang mengembalikan nilai atauPromise
nilai. Alasan mengapa kedua metode ini memiliki nama yang berbeda di Java adalah karena penghapusan yang umum .Function<? super T,? extends U> fn
danFunction<? super T,? extends CompletionStage<U>> fn
dianggap sebagai jenis Runtime yang sama -Function
. JadithenApply
danthenCompose
harus diberi nama yang berbeda, atau kompiler Java akan mengeluh tentang tanda tangan metode yang identik. Hasil akhirnya adalah, JavascriptPromise.then
diimplementasikan dalam dua bagian -thenApply
danthenCompose
- di Java.Anda dapat membaca jawaban saya yang lain jika Anda juga bingung tentang fungsi terkait
thenApplyAsync
.sumber