Java 验证completablefutures列表的大小
我有一个类似的代码Java 验证completablefutures列表的大小,java,testing,java-8,mockito,completable-future,Java,Testing,Java 8,Mockito,Completable Future,我有一个类似的代码 public void myMethod(){ List<CompletableFuture<Void>> futures = new ArrayList<>(); //getQuestion, getAnswer, both returns a CompletableFuture<Void> futures.add(getQuestion());
public void myMethod(){
List<CompletableFuture<Void>> futures = new ArrayList<>();
//getQuestion, getAnswer, both returns a CompletableFuture<Void>
futures.add(getQuestion());
futures.add(getAnswer());
// make sure all the futures are executed.
CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])).join();
}
public void myMethod(){
列表期货=新的ArrayList();
//getQuestion和getAnswer都返回一个完整的未来
futures.add(getQuestion());
futures.add(getAnswer());
//确保所有的期货都被执行。
CompletableFuture.allOf(futures.toArray(新的CompletableFuture[futures.size())).join();
}
- 执行myMethod()*
public void myMethod(){
List<CompletableFuture<Void>> futures = constructFutures();
// make sure all the futures are executed.
CompletableFuture
.allOf(futures.toArray(new CompletableFuture[futures.size()]))
.join();
}
List<CompletableFuture<Void>> constructFutures() {
List<CompletableFuture<Void>> futures = new ArrayList<>();
//getQuestion, getAnswer, both returns a CompletableFuture<Void>
futures.add(getQuestion());
futures.add(getAnswer());
return futures;
}
public void myMethod(){
列表期货=构造期货();
//确保所有的期货都被执行。
完全未来
.allOf(futures.toArray(新的CompletableFuture[futures.size()]))
.join();
}
清单1(){
列表期货=新的ArrayList();
//getQuestion和getAnswer都返回一个完整的未来
futures.add(getQuestion());
futures.add(getAnswer());
收益期货;
}
并为
constructFutures()
添加测试。您可以将该方法拆分为两部分:
public void myMethod(){
List<CompletableFuture<Void>> futures = constructFutures();
// make sure all the futures are executed.
CompletableFuture
.allOf(futures.toArray(new CompletableFuture[futures.size()]))
.join();
}
List<CompletableFuture<Void>> constructFutures() {
List<CompletableFuture<Void>> futures = new ArrayList<>();
//getQuestion, getAnswer, both returns a CompletableFuture<Void>
futures.add(getQuestion());
futures.add(getAnswer());
return futures;
}
public void myMethod(){
列表期货=构造期货();
//确保所有的期货都被执行。
完全未来
.allOf(futures.toArray(新的CompletableFuture[futures.size()]))
.join();
}
清单1(){
列表期货=新的ArrayList();
//getQuestion和getAnswer都返回一个完整的未来
futures.add(getQuestion());
futures.add(getAnswer());
收益期货;
}
并添加对
constructFutures()
的测试。测试数组的大小没有意义。在Java中,数组从不改变大小,这也适用于futures.toArray(…)
返回的数组。如果数组的大小错误,则意味着特定集合的toArray
实现已经返回了错误大小的数组
通过使用futures.toArray(新的CompletableFuture[0])
,让toArray
实现创建一个大小合适的数组,而不是传入一个预先指定的数组,可以使代码更加健壮。正如在中所解释的,它实际上更快,与古老的神话相反
当然,对于固定数量的未来,根本不需要在集合和数组之间进行转换。你可以用
public void myMethod() {
CompletableFuture<?>[] futures = { getQuestion(), getAnswer() };
// make sure all the futures are executed.
CompletableFuture.allOf(futures).join();
}
public void myMethod(){
CompletableFuture[]futures={getQuestion(),getAnswer()};
//确保所有的期货都被执行。
CompletableFuture.allOf(futures.join();
}
CompletableFuture的合约。allOf
将返回一个期货,该期货将在所有期货完成后完成,join()
将无条件等待该期货完成。没有什么需要检查的。如果任何未来异常完成,则join()
方法将抛出异常,要么是CompletionException
将原始异常作为原因,要么是CancellationException
,当异常完成是由取消引起的。测试数组大小没有意义。在Java中,数组从不改变大小,这也适用于futures.toArray(…)
返回的数组。如果数组的大小错误,则意味着特定集合的toArray
实现已经返回了错误大小的数组
通过使用futures.toArray(新的CompletableFuture[0])
,让toArray
实现创建一个大小合适的数组,而不是传入一个预先指定的数组,可以使代码更加健壮。正如在中所解释的,它实际上更快,与古老的神话相反
当然,对于固定数量的未来,根本不需要在集合和数组之间进行转换。你可以用
public void myMethod() {
CompletableFuture<?>[] futures = { getQuestion(), getAnswer() };
// make sure all the futures are executed.
CompletableFuture.allOf(futures).join();
}
public void myMethod(){
CompletableFuture[]futures={getQuestion(),getAnswer()};
//确保所有的期货都被执行。
CompletableFuture.allOf(futures.join();
}
CompletableFuture的合约。allOf
将返回一个期货,该期货将在所有期货完成后完成,join()
将无条件等待该期货完成。没有什么需要检查的。如果任何未来异常完成,则join()
方法将抛出异常,无论是CompletionException
将原始异常作为原因,还是CancellationException
当异常完成是由取消引起的。您可以将返回类型设为int,只返回期货集合的大小?很遗憾,我不能,myMethod()是接口的一部分,这是无效的。您可能需要在方法内部的其他地方设置一个变量,然后在方法完成后检查该变量,这取决于调用该变量的方式,因为您需要确保该变量不会同时从多个位置更新。@Plancke,您是否建议将futures list保留为类变量?如果是的话,我试过这样做,但我仍然不确定,我如何才能测试它。此外,我觉得这可能也不是正确的方式。CompletableFuture#allOf#join确保所有这些都运行并完成。如果任何一个期货失败,所有期货也将失败。因此,您可能希望对单个期货进行错误处理,因为如果两者都失败,主期货可能会丢失stacktrace。为什么您需要知道运行了多少个futures?顺便说一句,您可以将返回类型设为int,然后只返回futures集合的大小?不幸的是,我不能,myMethod()是接口的一部分,它是无效的。您可能需要在方法内部的其他地方设置一个变量,然后从