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()是接口的一部分,它是无效的。您可能需要在方法内部的其他地方设置一个变量,然后从