Java CompletableFuture.allOf()不';找不到任何数组元素

Java CompletableFuture.allOf()不';找不到任何数组元素,java,future,Java,Future,下面是一个非常简单的代码片段: String[] list = {"a", "b", "c"}; List<CompletableFuture<String>> completableFutureList = new ArrayList<>(); for (String s : list) { completableFutureList.add(CompletableFuture.supplyAsync(() -> s)

下面是一个非常简单的代码片段:

String[] list = {"a", "b", "c"};
List<CompletableFuture<String>> completableFutureList = new ArrayList<>();
for (String s : list) {
    completableFutureList.add(CompletableFuture.supplyAsync(() -> s)
            .thenApply(String::toUpperCase));
}
CompletableFuture<String>[] a = completableFutureList
        .toArray(new CompletableFuture[completableFutureList.size()]);
System.out.println(a.length);
CompletableFuture.allOf(a).whenComplete((r, e) -> {
    if (null != r) {
        System.out.println(r);
    } else {
        throw new RuntimeException(e);
    }
});
String[]list={“a”、“b”、“c”};
List completableFutureList=新建ArrayList();
用于(字符串s:列表){
completableFutureList.add(CompletableFuture.supplyAsync(()->s)
.thenApply(String::toUpperCase));
}
CompletableFuture[]a=completableFutureList
.toArray(新的CompletableFuture[completableFutureList.size()]);
系统输出打印长度(a.长度);
可完成的未来。所有(a)。当完成时((r,e)->{
if(null!=r){
系统输出println(r);
}否则{
抛出新的运行时异常(e);
}
});

我希望程序应该打印“abc”。但实际上什么也没印出来。为什么以及如何解决这个问题?

引用了
CompletableFuture.allOf()
方法的Javadoc(强调我的):

返回一个新的
CompletableFuture
,当所有 给定的
CompletableFutures
complete。如果有任何
CompletableFutures
异常完成,然后返回
CompletableFuture
也会这样做,带有一个
CompletionException
将此异常作为其原因否则,结果, 如果有,则给定的
可完成期货的
返回的
CompletableFuture
,但可以通过以下方式获得: 单独检查。
如果没有
CompletableFutures
如果提供,则返回一个
CompletableFuture
已完成的值 {@code null}

因此,我认为您需要在
whenComplete()
回调中手动查询它们(例如使用
a[0].get()
)。大概是这样的:

CompletableFuture.allOf(a).whenComplete((r, e) -> {
    for (CompletableFuture<String> future : a) {
        try {
           System.out.println(future.get());
        }
        catch (InterruptedException | ExecutionException e1) {
           e1.printStackTrace();
        }
    }
});
CompletableFuture.allOf(a).当完成时((r,e)->{
用于(可完成的未来:a){
试一试{
System.out.println(future.get());
}
捕获(中断异常|执行异常e1){
e1.printStackTrace();
}
}
});

引用
CompletableFuture.allOf()
方法的Javadoc(强调我的):

返回一个新的
CompletableFuture
,当所有 给定的
CompletableFutures
complete。如果有任何
CompletableFutures
异常完成,然后返回
CompletableFuture
也会这样做,带有一个
CompletionException
将此异常作为其原因否则,结果, 如果有,则给定的
可完成期货的
返回的
CompletableFuture
,但可以通过以下方式获得: 单独检查。
如果没有
CompletableFutures
如果提供,则返回一个
CompletableFuture
已完成的值 {@code null}

因此,我认为您需要在
whenComplete()
回调中手动查询它们(例如使用
a[0].get()
)。大概是这样的:

CompletableFuture.allOf(a).whenComplete((r, e) -> {
    for (CompletableFuture<String> future : a) {
        try {
           System.out.println(future.get());
        }
        catch (InterruptedException | ExecutionException e1) {
           e1.printStackTrace();
        }
    }
});
CompletableFuture.allOf(a).当完成时((r,e)->{
用于(可完成的未来:a){
试一试{
System.out.println(future.get());
}
捕获(中断异常|执行异常e1){
e1.printStackTrace();
}
}
});