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

Reply via email to