diff --git a/vavr/src/main/java/io/vavr/collection/Iterator.java b/vavr/src/main/java/io/vavr/collection/Iterator.java index 4b951e7174..6bbc792754 100644 --- a/vavr/src/main/java/io/vavr/collection/Iterator.java +++ b/vavr/src/main/java/io/vavr/collection/Iterator.java @@ -2125,7 +2125,8 @@ final class DistinctIterator extends AbstractIterator { private final Iterator that; private io.vavr.collection.Set known; private final Function keyExtractor; - private T next = null; + private boolean nextDefined = false; + private T next; DistinctIterator(Iterator that, Set set, Function keyExtractor) { this.that = that; @@ -2135,20 +2136,27 @@ final class DistinctIterator extends AbstractIterator { @Override public boolean hasNext() { - while (next == null && that.hasNext()) { + return nextDefined || searchNext(); + } + + private boolean searchNext() { + while (that.hasNext()) { final T elem = that.next(); final U key = keyExtractor.apply(elem); if (!known.contains(key)) { known = known.add(key); + nextDefined = true; next = elem; + return true; } } - return next != null; + return false; } @Override public T getNext() { final T result = next; + nextDefined = false; next = null; return result; } diff --git a/vavr/src/test/java/io/vavr/collection/IteratorTest.java b/vavr/src/test/java/io/vavr/collection/IteratorTest.java index 7fe879fe8e..b65ea35c07 100644 --- a/vavr/src/test/java/io/vavr/collection/IteratorTest.java +++ b/vavr/src/test/java/io/vavr/collection/IteratorTest.java @@ -467,6 +467,28 @@ public void shouldGenerateFiniteStreamBasedOnOptionSupplier() { assertThat(Iterator.iterate(new OptionSupplier(1, 4)).take(50000).reduce((i, j) -> i + j)).isEqualTo(6); } + // -- distinct + + @Test + public void shouldStayEmptyOnDistinct() { + assertThat(empty().distinct().toList()).isSameAs(List.empty()); + } + + @Test(/* #2425 */) + public void shouldNotEatNullOnDistinct() { + assertThat(of((String) null).distinct().toList()).isEqualTo(List.of((String) null)); + } + + @Test + public void shouldKeepDistinctElementsOnDistinct() { + assertThat(of(1, 2, 3).distinct().toList()).isEqualTo(List.of(1, 2, 3)); + } + + @Test + public void shouldRemoveDuplicatesOnDistinct() { + assertThat(of(1, 2, 1, 3, 3).distinct().toList()).isEqualTo(List.of(1, 2, 3)); + } + // -- groupBy @Override