Java CompletableFuture.allOf() не находит каких-либо элементов массива

Вопрос задан: 9 месяцев назад Последняя активность: 9 месяцев назад
up 0 down

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

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 ответ

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Реклама

up 1 down accepted

Приводя Javadoc из CompletableFuture.allOf() метод (курсив мой):

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

Так что я думаю, что вам нужно запросить их вручную (с помощью 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();
        }
    }
});