thenApplyและมีวิธีการของthenCompose CompletableFutureใช้เมื่อคุณตั้งใจจะทำบางสิ่งบางอย่างเพื่อให้CompleteableFutureได้ผลลัพธ์ด้วยไฟล์Function.
thenApplyและthenComposeทั้งสองส่งกลับCompletableFutureเป็นผลลัพธ์ของตัวเอง คุณสามารถเชื่อมโยงหลายรายการthenApplyหรือthenComposeรวมกัน จัดหาเพื่อการโทรแต่ละครั้งซึ่งผลจะมีการป้อนข้อมูลต่อไปFunctionFunction
สิ่งที่Functionคุณให้มาบางครั้งจำเป็นต้องทำบางอย่างพร้อมกัน ประเภทผลตอบแทนของคุณFunctionควรเป็นFutureประเภทที่ไม่ใช่ ในกรณีนี้คุณควรใช้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
ครั้งอื่น ๆ Functionที่คุณอาจต้องการที่จะทำการประมวลผลไม่ตรงกันในเรื่องนี้ ในกรณีนั้นคุณควรใช้thenCompose. ประเภทการกลับมาของคุณควรจะเป็นFunction CompletionStageถัดไปFunctionในห่วงโซ่จะได้รับผลลัพธ์ของสิ่งนั้นCompletionStageเป็นอินพุตดังนั้นจึงคลายไฟล์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
Promiseนี้เป็นความคิดที่คล้ายกับจาวาสคริปต์ของ Promise.thenสามารถยอมรับฟังก์ชันที่ส่งคืนค่าหรือPromiseค่า เหตุผลที่ว่าทำไมทั้งสองวิธีมีชื่อที่แตกต่างกันในชวาเกิดจากการลบออกทั่วไป Function<? super T,? extends U> fnและFunction<? super T,? extends CompletionStage<U>> fnได้รับการพิจารณาประเภทเดียวกัน Runtime Function- ดังนั้นthenApplyและthenComposeต้องตั้งชื่อให้ชัดเจนมิฉะนั้นคอมไพเลอร์ Java จะบ่นเกี่ยวกับลายเซ็นวิธีการที่เหมือนกัน ผลลัพธ์สุดท้ายคือ Javascript Promise.thenถูกนำไปใช้ในสองส่วน - thenApplyและthenCompose- ใน Java
คุณสามารถอ่านคำตอบอื่น ๆ ของฉันthenApplyAsyncถ้าคุณยังสับสนเกี่ยวกับฟังก์ชั่นที่เกี่ยวข้อง
mapและflatMapในStreamหรือไม่?thenApplyเป็นmapและthenComposeเป็นของflatMapCompletableFutureคุณใช้thenComposeเพื่อหลีกเลี่ยงการมีCompletableFuture<CompletableFuture<..>>.