将 Futures.successfulAsList 替换为 Java 8 CompletableFuture?

Replace Futures.successfulAsList with Java 8 CompletableFuture?

我正在寻找用 Java 8 的 CompletableFuture 代码替换 Guava 的 Futures.successfulAsList() 的规范代码。

我认为 CompletableFuture.allOf() seems like a replacement for Futures.allAsList(),但我没有看到任何类似 successfulAsList() 的东西。

CompletableFuture.allOf(…) 实际上比 allAsList().

更接近 successfulAsList()

事实上,allOf() 只有在所有给定的期货都完成后才完成,无论是有值还是异常。然后你可以检查每个 future 来检查它是如何完成的(例如在下面的 thenAccept()/thenApply())。

allAsList()CompletableFuture 中没有近似等价物,因为一旦任何输入期货失败,它就会失败。但是,您可以通过组合 allOf() 并将每个输入 future 与 exceptionally() 链接来实现它,这将使 allOf() 返回的 future 立即失败:

CompletableFuture<String> a = …, b = …, c = …;
CompletableFuture<Void> allWithFailFast = CompletableFuture.allOf(a, b, c);
Stream.of(a, b, c)
    .forEach(f -> f.exceptionally(e -> {
        allWithFailFast.completeExceptionally(e);
        return null;
    }));