使用 java 8 api 在 CompletableFuture 上流式传输时出现编译错误

compile error while using java 8 api to stream on CompletableFuture

这个有效:

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

    }

试试这个,

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

如果您无论如何都要立即阻塞当前线程,那么使用 allOfthenApply 是没有意义的 .get()

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

allOf 方法会很有用 return CompletableFuture<Long> 并让您的方法的客户决定何时以及在哪个线程中等待完成。