Java 在CompletableFuture中执行不同签名的方法

Java 在CompletableFuture中执行不同签名的方法,java,asynchronous,completable-future,Java,Asynchronous,Completable Future,从下面的代码中,我想在foo1中完成foo2后执行foo3。无法更改foo1的方法签名。一种方法是将foo3移动到foo2,但这将打破关注点的分离 @Override CompletableFuture<Integer> foo1(String str) { return CompletableFuture.supplyAsync(() -> foo2(str)); } Integer foo2(String str) { return 0; } void

从下面的代码中,我想在
foo1
中完成
foo2
后执行
foo3
。无法更改
foo1
的方法签名。一种方法是将
foo3
移动到
foo2
,但这将打破关注点的分离

@Override
CompletableFuture<Integer> foo1(String str) {
    return CompletableFuture.supplyAsync(() -> foo2(str));
}

Integer foo2(String str) {
    return 0;
}

void foo3(String str) {
    System.out.println("Done");
}
@覆盖
CompletableFuture foo1(字符串str){
返回CompletableFuture.supplyAsync(()->foo2(str));
}
整数foo2(字符串str){
返回0;
}
void foo3(字符串str){
系统输出打印项次(“完成”);
}

假设您只想在
foo2
之后调用
foo3
并返回
foo2
输出,那么您可以这样做:

return CompletableFuture.supplyAsync(() -> {
                Integer r = foo2(str);
                foo3("testing");
                return r;
            }
    );
你是说像

foo1(str).thenRun(() -> foo3(str);

因为您似乎对
foo1
的结果不感兴趣

如果
foo3
调用应该是
foo1
的一部分,那么这是一种方法:

CompletableFuture<Integer> foo1(String str) {
    return CompletableFuture.supplyAsync(() -> foo2(str))
            .thenApply(foo2Result -> {
                        foo3(str);
                        return foo2Result;
                    }
            );
}

让你的lambda在foo2之后调用foo3<代码>{int res=foo2(str);foo3(str);return res;}你的意思是
返回CompletableFuture.supplyAsync(()->foo2(str))。然后运行(()->foo3(str))?这不起作用,因为它返回
CompletableFuture
。哦,没关系,我明白了,但我希望
foo3
foo1
内部调用,而不是外部调用。
foo1(str).thenApply(result -> {
            foo3(str);
            return result;
        }
);