假设我有CompletableFutures A,B和C是可运行的。 B取决于A和C取决于A和B,我可以做A然后组合B和B然后组合A所以C得到A和B的值,即使B依赖于A的值也是吗?
基本上我要问的是 - 有没有办法获得像这样的CompletableFuture管道:
A -- B -- C
-------^
CompletableFuture<String> A = CompletableFuture.supplyAsync(() -> return "Hello");
CompletableFuture<String> B = A.thenApplyAsync(stringA -> return stringA + "World");
B.thenCombine(A, (stringA, StringB) -> doStuffWithAAndB(stringA, stringB));
希望这是有道理的。
答案 0 :(得分:0)
如果您可以使用RxJava2,则可以按照以下步骤操作:
import io.reactivex.Observable;
public class CompletableFutureDemo {
public static void main(String[] args) {
CompletableFuture<String> a = CompletableFuture.supplyAsync(() -> "Hello");
Observable<String> obsA = Observable.fromFuture(a);
Observable<String> obsB = obsA.map(stringA -> stringA + " world");
Observable.zip(obsA, obsB, (stringA, stringB) -> {
return stringA + " " + stringB;
})
.subscribe(zipped -> {
System.out.println(zipped);
});
}
答案 1 :(得分:0)
这样做完全没问题。将CompletableFuture
组合在一起的方式没有限制。
你有责任确保它们最终完成,但这不是问题。
或者,您可以直接从回调访问A,如下所示:
CompletableFuture<String> a = CompletableFuture.supplyAsync(() -> return "Hello");
CompletableFuture<String> b = a.thenApplyAsync(stringA -> return stringA + "World");
b.thenApply(stringB -> doStuffWithAAndB(a.join(), stringB));
但这确实是一个偏好的问题。