在 CompletableFuture 中执行一个不同签名的方法
Execute a method of different signature in CompletableFuture
从下面的代码中,我想在 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");
}
假设您只想在 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;
}
);
从下面的代码中,我想在 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");
}
假设您只想在 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;
}
);