thenApplyvà thenComposelà 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ó CompleteableFuturekết quả là a Function.
thenApplyvà thenComposecả hai đều trả về a CompletableFuturelà kết quả của riêng chúng. Bạn có thể chuỗi nhiều thenApplyhoặc thenComposecùng nhau. Cung cấp a Functioncho 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 Functionbạ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 Functionphải là Futureloạ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 Functionphải là a CompletionStage. Tiếp theo Functiontrong chuỗi sẽ lấy kết quả của đó CompletionStagelà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.thencó thể chấp nhận một hàm trả về một giá trị hoặc Promisemộ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> fnvà Function<? super T,? extends CompletionStage<U>> fnđược coi là cùng một loại Thời gian chạy - Function. Do đó thenApplyvà thenComposephả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 - thenApplyvà 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.
mapvàflatMaptrongStreamkhông?thenApplylàmapvàthenComposelàflatMapcủaCompletableFuture. Bạn sử dụngthenComposeđể tránh cóCompletableFuture<CompletableFuture<..>>.