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