thenApplyve thenComposeyöntemleridir CompletableFuture. A CompleteableFutureile sonucunu elde etmek için bir şey yapmak istediğinizde bunları kullanın Function.
thenApplyve thenComposeher ikisi de CompletableFuturekendi sonucu olarak a döndürür . Birden çok thenApplyveya thenComposebirlikte zincirleyebilirsiniz . Bir tedarik Functionedilen sonuç bir sonraki giriş olacak Her arama için Function.
FunctionBazen verilen eşzamanlı bir şeyler yapmak gerekiyor. Dönüş türünüzün türü Functionolmayan olmalıdır Future. Bu durumda kullanmalısınız 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
Diğer zamanlarda bunun içinde eşzamansız işlem yapmak isteyebilirsiniz Function. Bu durumda kullanmalısınız thenCompose. Dönüş türünüz Functionbir CompletionStage. FunctionZincirdeki bir sonraki , bunun sonucunu CompletionStagegirdi olarak alacak , böylece 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
Bu, Javascript'inkine benzer bir fikirdir Promise. Promise.thenbir değer veya bir değer döndüren bir işlevi kabul edebilir Promise. Bu iki yöntemin Java'da farklı isimlere sahip olmasının nedeni, genel silme işleminden kaynaklanmaktadır . Function<? super T,? extends U> fnve Function<? super T,? extends CompletionStage<U>> fnaynı Runtime türü olarak kabul edilir - Function. Bu nedenle thenApplyve thenComposeaçıkça adlandırılması gerekir, yoksa Java derleyicisi aynı yöntem imzalarından şikayet ederdi. Sonuçta varlık, JavaScript adlı Promise.theniki parça halinde uygulanmaktadır - thenApplyve thenCompose- Java.
İlgili işlev hakkında kafanız karışırsa diğer cevabımı da okuyabilirsiniz thenApplyAsync.
mapveflatMapdeStream?thenApplyolduğumapvethenComposeolduğuflatMapbirCompletableFuture. SahipthenComposeolmaktan kaçınmak için kullanırsınCompletableFuture<CompletableFuture<..>>.