我有3个CompletableFutures全部3个返回不同的数据类型。Java 8 CompletableFutures allOf不同的数据类型
我正在创建一个结果对象,它是由所有3期货返回的结果的组成。
所以我当前工作的代码如下所示:
public ClassD getResultClassD() {
ClassD resultClass = new ClassD();
CompletableFuture<ClassA> classAFuture = CompletableFuture.supplyAsync(() -> service.getClassA());
CompletableFuture<ClassB> classBFuture = CompletableFuture.supplyAsync(() -> service.getClassB());
CompletableFuture<ClassC> classCFuture = CompletableFuture.supplyAsync(() -> service.getClassC());
CompletableFuture.allOf(classAFuture, classBFuture, classCFuture)
.thenAcceptAsync(it -> {
ClassA classA = classAFuture.join();
if (classA != null) {
resultClass.setClassA(classA);
}
ClassB classB = classBFuture.join();
if (classB != null) {
resultClass.setClassB(classB);
}
ClassC classC = classCFuture.join();
if (classC != null) {
resultClass.setClassC(classC);
}
});
return resultClass;
}
我的问题是:
我在这里的假设是因为我用
allOf
和thenAcceptAsync
这个电话将是不可阻挡。我的理解是正确的吗?这是处理多个期货返回不同结果类型的正确方法吗?
是否正确构造
ClassD
对象在thenAcceptAsync
内?- 是否适合在thenAcceptAsync lambda中使用
join
或getNow
方法?
感谢您的详细回复。我唯一跟进的答案是,thenApplyAsync有一个返回类型CompletableFuture,这将如何工作,以及如何调用此方法并使用结果 –
不,它是'allOf'的返回类型,它是'CompletableFuture'这就是为什么通过'thenApplyAsync'的函数收到'Void'作为输入(上面的'dummy'参数,而不是'dummy - >',你也可以写'(void dummy) - >')。然后,该函数将'Void'输入(实际上忽略它)转换为'ClassD'结果,所以'thenApplyAsync'的结果将是'CompletableFuture '。 –
Holger
@Holger我正在沿着一条类似的路线,但是我在服务调用中使用了Optional.ofNullable,所以你可以有'cCFuture.join()。ifPresent(class :: SetStuff)' – Ash