Java CompletableFuture.allOf () не находит элементов массива - PullRequest
0 голосов
/ 25 января 2019

Очень простой фрагмент кода, как показано ниже:

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

Я ожидаю, что программа должна напечатать "A B C". Но на самом деле ничего не печатается. Почему и как это исправить?

1 Ответ

0 голосов
/ 25 января 2019

Ссылаясь на Javadoc метода CompletableFuture.allOf() (выделено мной):

Возвращает новый CompletableFuture, который завершается, когда все данное CompletableFutures завершено. Если какой-либо из приведенных CompletableFutures завершить в порядке исключения, затем возвращается CompletableFuture также делает это, с CompletionException удерживая это исключение в качестве причины. В противном случае результаты, если таковые имеются, данные CompletableFutures не отражены в возвращенный CompletableFuture, но может быть получен осматривая их индивидуально. Если нет CompletableFutures при условии, возвращает CompletableFuture завершено со значением {@code null}.

Поэтому я думаю, что вам нужно запрашивать их вручную (например, с помощью a[0].get()) в обратном вызове whenComplete(). Примерно так:

CompletableFuture.allOf(a).whenComplete((r, e) -> {
    for (CompletableFuture<String> future : a) {
        try {
           System.out.println(future.get());
        }
        catch (InterruptedException | ExecutionException e1) {
           e1.printStackTrace();
        }
    }
});
...