JAMES-1925 Simplify CompletableFutureUtil::allOf Using thenCombine is more appropriate than using a custom thenCompose.
Note that it also adds a ~10% execution speed improvement. Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/eedcc93c Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/eedcc93c Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/eedcc93c Branch: refs/heads/master Commit: eedcc93cf87860463ce4dfd3f203dddae1e9a24e Parents: 7d6cbe2 Author: Benoit Tellier <btell...@linagora.com> Authored: Tue Oct 16 11:49:36 2018 +0700 Committer: Benoit Tellier <btell...@linagora.com> Committed: Wed Oct 31 09:12:08 2018 +0700 ---------------------------------------------------------------------- .../apache/james/util/CompletableFutureUtil.java | 17 ++++++----------- .../james/util/CompletableFutureUtilTest.java | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/eedcc93c/server/container/util/src/main/java/org/apache/james/util/CompletableFutureUtil.java ---------------------------------------------------------------------- diff --git a/server/container/util/src/main/java/org/apache/james/util/CompletableFutureUtil.java b/server/container/util/src/main/java/org/apache/james/util/CompletableFutureUtil.java index 5e237ab..19c94b4 100644 --- a/server/container/util/src/main/java/org/apache/james/util/CompletableFutureUtil.java +++ b/server/container/util/src/main/java/org/apache/james/util/CompletableFutureUtil.java @@ -19,6 +19,7 @@ package org.apache.james.util; +import java.util.Arrays; import java.util.Comparator; import java.util.Optional; import java.util.concurrent.CompletableFuture; @@ -42,17 +43,11 @@ public class CompletableFutureUtil { } public static <T> CompletableFuture<Stream<T>> allOf(Stream<CompletableFuture<T>> futureStream) { - return futureStream - .map((CompletableFuture<T> future) -> future.thenApply(Stream::of)) - .parallel() - .reduce((future1, future2) -> - future1.thenCompose( - stream1 -> future2.thenCompose( - stream2 -> { - Stream<T> concatStream = Stream.concat(stream1, stream2); - return CompletableFuture.completedFuture(concatStream); - }))) - .orElse(CompletableFuture.completedFuture(Stream.of())); + CompletableFuture<T>[] arrayOfFutures = futureStream.toArray(CompletableFuture[]::new); + + return CompletableFuture.allOf(arrayOfFutures) + .thenApply(any -> Arrays.stream(arrayOfFutures) + .map(CompletableFuture::join)); } public static <R, T> CompletableFuture<Stream<R>> chainAll(Stream<T> futureStream, http://git-wip-us.apache.org/repos/asf/james-project/blob/eedcc93c/server/container/util/src/test/java/org/apache/james/util/CompletableFutureUtilTest.java ---------------------------------------------------------------------- diff --git a/server/container/util/src/test/java/org/apache/james/util/CompletableFutureUtilTest.java b/server/container/util/src/test/java/org/apache/james/util/CompletableFutureUtilTest.java index 53ade79..7b651a5 100644 --- a/server/container/util/src/test/java/org/apache/james/util/CompletableFutureUtilTest.java +++ b/server/container/util/src/test/java/org/apache/james/util/CompletableFutureUtilTest.java @@ -20,6 +20,7 @@ package org.apache.james.util; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; import java.util.Optional; import java.util.concurrent.CompletableFuture; @@ -27,6 +28,7 @@ import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; @@ -140,6 +142,19 @@ public class CompletableFutureUtilTest { } @Test + public void allOfShouldSupportNullValue() { + assertThatCode(() -> + CompletableFutureUtil.allOf( + Stream.of( + CompletableFuture.completedFuture(null), + CompletableFuture.completedFuture(null), + CompletableFuture.completedFuture(null))) + .join() + .collect(Collectors.toList())) + .doesNotThrowAnyException(); + } + + @Test public void allOfShouldPreserveOrder() { long value1 = 18L; long value2 = 19L; --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org