[REFACTOR] Cleanup StreamUtils
diff --git a/server/container/util/src/main/java/org/apache/james/util/StreamUtils.java b/server/container/util/src/main/java/org/apache/james/util/StreamUtils.java
index 87194eb..ccdffd2 100644
--- a/server/container/util/src/main/java/org/apache/james/util/StreamUtils.java
+++ b/server/container/util/src/main/java/org/apache/james/util/StreamUtils.java
@@ -21,21 +21,12 @@
import java.util.Arrays;
import java.util.Collection;
-import java.util.List;
import java.util.Optional;
-import java.util.Spliterator;
-import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Stream;
-import java.util.stream.StreamSupport;
-
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
public class StreamUtils {
- private static final boolean PARALLEL = true;
-
@SafeVarargs
public static <T> Stream<T> ofNullables(T... array) {
return ofNullable(array);
@@ -59,73 +50,8 @@
return streams.flatMap(Function.identity());
}
- public static <T> boolean isSingleValued(Stream<T> stream) {
- return stream.distinct()
- .limit(2)
- .count() == 1;
- }
-
@SafeVarargs
public static <T> Stream<T> flatten(Stream<T>... streams) {
return flatten(Arrays.stream(streams));
}
-
- public static <T> Stream<T> unfold(T seed, Function<T, Optional<T>> generator) {
- return StreamSupport.stream(new UnfoldSpliterator(seed, generator), !PARALLEL);
- }
-
- public static <T> Stream<T> iterate(T seed, Long limit, Function<T, Stream<T>> generator) {
- Preconditions.checkArgument(limit >= 0, "StreamUtils.iterate have a given limit '{}', while it should not be negative", limit);
- return StreamUtils.unfold(Arrays.asList(seed), conservativeGenerator(generator))
- .limit(limit + 1)
- .flatMap(List::stream);
- }
-
- private static <T> Function<List<T>, Optional<List<T>>> conservativeGenerator(Function<T, Stream<T>> generator) {
- return previous -> {
- List<T> generated = previous.stream()
- .flatMap(generator)
- .collect(ImmutableList.toImmutableList());
-
- if (generated.isEmpty()) {
- return Optional.empty();
- } else {
- return Optional.of(generated);
- }
- };
- }
-
- private static class UnfoldSpliterator<T> implements Spliterator<T> {
-
- private static final Spliterator<?> NOT_ABLE_TO_SPLIT_SPLITERATOR = null;
- private Optional<T> current;
- private final Function<T, Optional<T>> generator;
-
- private UnfoldSpliterator(T seed, Function<T, Optional<T>> generator) {
- this.current = Optional.of(seed);
- this.generator = generator;
- }
-
- @Override
- public boolean tryAdvance(Consumer<? super T> action) {
- current.ifPresent(action);
- current = current.flatMap(generator);
- return current.isPresent();
- }
-
- @Override
- public Spliterator<T> trySplit() {
- return (Spliterator<T>) NOT_ABLE_TO_SPLIT_SPLITERATOR;
- }
-
- @Override
- public long estimateSize() {
- return Long.MAX_VALUE;
- }
-
- @Override
- public int characteristics() {
- return Spliterator.IMMUTABLE & Spliterator.NONNULL & Spliterator.ORDERED;
- }
- }
}
diff --git a/server/container/util/src/test/java/org/apache/james/util/StreamUtilsTest.java b/server/container/util/src/test/java/org/apache/james/util/StreamUtilsTest.java
index 8f1d2aa..6c14fbb 100644
--- a/server/container/util/src/test/java/org/apache/james/util/StreamUtilsTest.java
+++ b/server/container/util/src/test/java/org/apache/james/util/StreamUtilsTest.java
@@ -20,11 +20,8 @@
package org.apache.james.util;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatCode;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import java.util.Optional;
-import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Stream;
import org.junit.jupiter.api.Test;
@@ -114,71 +111,4 @@
.collect(ImmutableList.toImmutableList()))
.containsExactly(1, 2);
}
-
- @Test
- void unfoldShouldGenerateAFiniteStream() {
- Stream<Integer> unfolded = StreamUtils.unfold(1, i -> {
- if (i < 10) {
- return Optional.of(i + 1);
- } else {
- return Optional.empty();
- }
- });
-
- assertThat(unfolded.collect(ImmutableList.toImmutableList()))
- .contains(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
- }
-
- @Test
- void unfoldShouldGenerateALazyInfiniteStream() {
- AtomicInteger counter = new AtomicInteger(0);
- Stream<Integer> unfolded = StreamUtils.unfold(1, i -> {
- counter.incrementAndGet();
- return Optional.of(i + 1);
- });
-
- assertThat(unfolded.limit(10).collect(ImmutableList.toImmutableList()))
- .contains(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
-
- assertThat(counter.get())
- .isEqualTo(10);
- }
-
- @Test
- void unfoldShouldHaveAtLeastTheSeed() {
- Stream<Integer> unfolded = StreamUtils.unfold(1, i -> Optional.empty());
-
- assertThat(unfolded.collect(ImmutableList.toImmutableList()))
- .contains(1);
- }
-
- @Test
- void iterateWithANegativeLimitShouldThrow() {
- assertThatCode(() -> StreamUtils.iterate(1, (long) -1, Stream::of))
- .isInstanceOf(IllegalArgumentException.class);
- }
-
- @Test
- void iterateWithZeroLimitShouldHaveOnlyTheSeed() {
- Stream<Integer> generated = StreamUtils.iterate(1, (long) 0, Stream::of);
-
- assertThat(generated.collect(ImmutableList.toImmutableList()))
- .containsOnly(1);
- }
-
- @Test
- void iterateWithEmptyGeneratorShouldHaveOnlyTheSeed() {
- Stream<Integer> generated = StreamUtils.iterate(1, (long) 10, i -> Stream.of());
-
- assertThat(generated.collect(ImmutableList.toImmutableList()))
- .containsOnly(1);
- }
-
- @Test
- void iterateWithGeneratorShouldHaveOnlyTheLimitedElements() {
- Stream<Integer> generated = StreamUtils.iterate(1, (long) 5, i -> Stream.of(i + 1));
-
- assertThat(generated.collect(ImmutableList.toImmutableList()))
- .containsOnly(1, 2, 3, 4, 5, 6);
- }
}