Skip to content

Commit

Permalink
Refactored Stream.flatMap internal iterator to a static class (#2229)
Browse files Browse the repository at this point in the history
  • Loading branch information
audunhalland authored and danieldietrich committed Jan 6, 2019
1 parent 562967a commit 581675f
Showing 1 changed file with 27 additions and 19 deletions.
46 changes: 27 additions & 19 deletions vavr/src/main/java/io/vavr/collection/Stream.java
Original file line number Diff line number Diff line change
Expand Up @@ -1027,25 +1027,7 @@ default Stream<T> filter(Predicate<? super T> predicate) {
@Override
default <U> Stream<U> flatMap(Function<? super T, ? extends Iterable<? extends U>> mapper) {
Objects.requireNonNull(mapper, "mapper is null");
return isEmpty() ? Empty.instance() : Stream.ofAll(new Iterator<U>() {

final Iterator<? extends T> inputs = Stream.this.iterator();
java.util.Iterator<? extends U> current = java.util.Collections.emptyIterator();

@Override
public boolean hasNext() {
boolean currentHasNext;
while (!(currentHasNext = current.hasNext()) && inputs.hasNext()) {
current = mapper.apply(inputs.next()).iterator();
}
return currentHasNext;
}

@Override
public U next() {
return current.next();
}
});
return isEmpty() ? Empty.instance() : Stream.ofAll(new FlatMapIterator<>(this.iterator(), mapper));
}

@Override
Expand Down Expand Up @@ -2100,4 +2082,30 @@ public T getNext() {
return stream.head();
}
}

final class FlatMapIterator<T, U> implements Iterator<U> {

final Function<? super T, ? extends Iterable<? extends U>> mapper;
final Iterator<? extends T> inputs;
java.util.Iterator<? extends U> current = java.util.Collections.emptyIterator();

FlatMapIterator(Iterator<? extends T> inputs, Function<? super T, ? extends Iterable<? extends U>> mapper) {
this.inputs = inputs;
this.mapper = mapper;
}

@Override
public boolean hasNext() {
boolean currentHasNext;
while (!(currentHasNext = current.hasNext()) && inputs.hasNext()) {
current = mapper.apply(inputs.next()).iterator();
}
return currentHasNext;
}

@Override
public U next() {
return current.next();
}
}
}

0 comments on commit 581675f

Please sign in to comment.