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

Execute a method of different signature in CompletableFuture

从下面的代码中,我想在 foo1foo2 完成后执行 foo3foo1 的方法签名无法更改。一种方法是将 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");
}

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

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;
                    }
            );
}

或者如果你想调用它,在foo1被调用的地方:

foo1(str).thenApply(result -> {
            foo3(str);
            return result;
        }
);