thenApply
và thenCompose
là các phương pháp của CompletableFuture
. Sử dụng chúng khi bạn có ý định làm điều gì đó để có CompleteableFuture
kết quả là a Function
.
thenApply
và thenCompose
cả hai đều trả về a CompletableFuture
là kết quả của riêng chúng. Bạn có thể chuỗi nhiều thenApply
hoặc thenCompose
cùng nhau. Cung cấp a Function
cho mỗi cuộc gọi, kết quả của nó sẽ là đầu vào cho lệnh tiếp theo Function
.
Các Function
bạn cung cấp đôi khi cần phải làm điều gì đó đồng bộ. Loại trả về của bạn Function
phải là Future
loại không phải . Trong trường hợp này bạn nên sử dụng thenApply
.
CompletableFuture.completedFuture(1)
.thenApply((x)->x+1) // adding one to the result synchronously, returns int
.thenApply((y)->System.println(y)); // value of y is 1 + 1 = 2
Lần khác, bạn có thể muốn thực hiện xử lý không đồng bộ trong việc này Function
. Trong trường hợp đó bạn nên sử dụng thenCompose
. Loại trả lại của bạn Function
phải là a CompletionStage
. Tiếp theo Function
trong chuỗi sẽ lấy kết quả của đó CompletionStage
làm đầu vào, do đó mở gói CompletionStage
.
// addOneAsync may be implemented by using another thread, or calling a remote method
abstract CompletableFuture<Integer> addOneAsync(int input);
CompletableFuture.completedFuture(1)
.thenCompose((x)->addOneAsync(x)) // doing something asynchronous, returns CompletableFuture<Integer>
.thenApply((y)->System.println(y)); // y is an Integer, the result of CompletableFuture<Integer> above
Đây là một ý tưởng tương tự như của Javascript Promise
. Promise.then
có thể chấp nhận một hàm trả về một giá trị hoặc Promise
một giá trị. Lý do tại sao hai phương thức này có tên khác nhau trong Java là do tính năng xóa chung . Function<? super T,? extends U> fn
và Function<? super T,? extends CompletionStage<U>> fn
được coi là cùng một loại Thời gian chạy - Function
. Do đó thenApply
và thenCompose
phải được đặt tên rõ ràng, nếu không trình biên dịch Java sẽ phàn nàn về các chữ ký phương thức giống hệt nhau. Kết quả cuối cùng là, Javascript Promise.then
được triển khai thành hai phần - thenApply
và thenCompose
- trong Java.
Bạn có thể đọc câu trả lời khác của tôi nếu bạn cũng bối rối về một chức năng liên quan thenApplyAsync
.
map
vàflatMap
trongStream
không?thenApply
làmap
vàthenCompose
làflatMap
củaCompletableFuture
. Bạn sử dụngthenCompose
để tránh cóCompletableFuture<CompletableFuture<..>>
.