我想在 CompletableFuture List 中做一些事情作为未来完成的订单

I want do something as future done order in CompletableFuture List

我有这样的服务returnCompletableFutures

Set<CompletableFuture<String>> futures = service.getSomething();

for (CompletableFuture<String> future : futures) {
    System.out.println(future.get());
}

此代码打印值迭代顺序。但我想先快速打印结果,比如使用 CompletionService.

Set<CompletableFuture<String>> futures = service.getSomething();
Set<CompletableFuture<String>> donefutures = new HashSet<>();

while (true) {
    if (futures.equals(donefutures)) {
        break;
    }

    futures
            .stream()
            .filter(f -> !donefutures.contains(f))
            .filter(CompletableFuture::isDone)
            .peek(donefutures::add)
            .map(f -> {
                try {
                    return f.get();
                } catch (InterruptedException | ExecutionException e) {
                    return null;
                }
            })
            .forEach(System.out::println);

    Thread.sleep(100);
}

我试过这种方法。它的工作。但是我觉得真的很难看。有没有更好的办法?

您使用 CompletableFuture 就像使用 Future 一样,阻塞方式 运行 无限循环。您必须指定回调函数,该函数将在您的未来完成时调用。

所以你可以这样做:

Set<CompletableFuture<String>> futures = service.getSomething();
futures.forEach(future -> future.whenComplete(
        (result, throwable) -> System.out.println(result)
));

CompletableFuture
    .allOf(futures.toArray(new CompletableFuture[0]))
    .join();