7

I am Looking for canonical code to replace Guava's Futures.successfulAsList() with Java 8's CompletableFuture code.

I think CompletableFuture.allOf() seems like a replacement for Futures.allAsList(), but I don't see anything quite like successfulAsList().

Didier L
  • 18,905
  • 10
  • 61
  • 103
Miket
  • 73
  • 1
  • 5

1 Answers1

9

CompletableFuture.allOf(…) is actually closer to successfulAsList() than allAsList().

Indeed, allOf() only completes after all the given futures have completed, be it with a value or an exception. You can then inspect each future to check how it completed (e.g. in a following thenAccept()/thenApply()).

allAsList() does not have a close equivalent in CompletableFuture because it should fail as soon as any of the input futures fails. However, you could implement it with a combination of allOf() and chaining each input future with an exceptionally() that would make the future returned by allOf() immediately fail:

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;
    }));
Didier L
  • 18,905
  • 10
  • 61
  • 103