ошибка компиляции при использовании Java 8 API для потоковой передачи на CompletableFuture - PullRequest
0 голосов
/ 25 мая 2018

Это работает:

public Long getMaxSalary(List<CompletableFuture<EmployeeData>> futures) {

CompletableFuture<Void> allDoneFuture = CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()]));
CompletableFuture<List<EmployeeData>> employeeDataList = allDoneFuture.thenApply(v ->
                            futures.stream()
                                    .map(f -> f.join())
                                    .collect(Collectors.toList()));

List<EmployeeData> rc = employeeDataList.get();
OptionalLong op = rc.stream().mapToLong(r -> r.salary()).max();
return op.getAsLong();


}

пытается сделать этот лаконичный сброс ошибок компилятора в IDE.Я не могу понять, в чем ошибка.Я пытаюсь объединить это в один поток.

    public Long getMaxSalary(List<CompletableFuture<EmployeeData>> futures) {

    CompletableFuture<Void> allDoneFuture = CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()]));

    return allDoneFuture.thenApply(v ->
                                futures.stream()
                                        .map(f -> f.join())
                                        .mapToLong(r -> r.salary())
                                        .max()).getAsLong();

    }

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Нет смысла использовать allOf и thenApply, если вы все равно собираетесь заблокировать текущий поток с помощью немедленного подхода .get()

return futures.stream()
    .map(CompletableFuture::join)
    .mapToLong(EmployeeData::salary)
    .max()
    .getAsLong();  // or throw if futures is empty

allOf, если выхотел вернуть CompletableFuture<Long> и позволить клиентам вашего метода решить, когда и в каком потоке ожидать завершения.

0 голосов
/ 25 мая 2018

Попробуйте,

return allDoneFuture.thenApply(v -> futures.stream().map(f -> f.join())).get()
        .mapToLong(empData -> empData.salary()).max().getAsLong();
...