Skip to content

Commit 581675f

Browse files
audunhallanddanieldietrich
authored andcommitted
Refactored Stream.flatMap internal iterator to a static class (#2229)
1 parent 562967a commit 581675f

File tree

1 file changed

+27
-19
lines changed

1 file changed

+27
-19
lines changed

vavr/src/main/java/io/vavr/collection/Stream.java

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,25 +1027,7 @@ default Stream<T> filter(Predicate<? super T> predicate) {
10271027
@Override
10281028
default <U> Stream<U> flatMap(Function<? super T, ? extends Iterable<? extends U>> mapper) {
10291029
Objects.requireNonNull(mapper, "mapper is null");
1030-
return isEmpty() ? Empty.instance() : Stream.ofAll(new Iterator<U>() {
1031-
1032-
final Iterator<? extends T> inputs = Stream.this.iterator();
1033-
java.util.Iterator<? extends U> current = java.util.Collections.emptyIterator();
1034-
1035-
@Override
1036-
public boolean hasNext() {
1037-
boolean currentHasNext;
1038-
while (!(currentHasNext = current.hasNext()) && inputs.hasNext()) {
1039-
current = mapper.apply(inputs.next()).iterator();
1040-
}
1041-
return currentHasNext;
1042-
}
1043-
1044-
@Override
1045-
public U next() {
1046-
return current.next();
1047-
}
1048-
});
1030+
return isEmpty() ? Empty.instance() : Stream.ofAll(new FlatMapIterator<>(this.iterator(), mapper));
10491031
}
10501032

10511033
@Override
@@ -2100,4 +2082,30 @@ public T getNext() {
21002082
return stream.head();
21012083
}
21022084
}
2085+
2086+
final class FlatMapIterator<T, U> implements Iterator<U> {
2087+
2088+
final Function<? super T, ? extends Iterable<? extends U>> mapper;
2089+
final Iterator<? extends T> inputs;
2090+
java.util.Iterator<? extends U> current = java.util.Collections.emptyIterator();
2091+
2092+
FlatMapIterator(Iterator<? extends T> inputs, Function<? super T, ? extends Iterable<? extends U>> mapper) {
2093+
this.inputs = inputs;
2094+
this.mapper = mapper;
2095+
}
2096+
2097+
@Override
2098+
public boolean hasNext() {
2099+
boolean currentHasNext;
2100+
while (!(currentHasNext = current.hasNext()) && inputs.hasNext()) {
2101+
current = mapper.apply(inputs.next()).iterator();
2102+
}
2103+
return currentHasNext;
2104+
}
2105+
2106+
@Override
2107+
public U next() {
2108+
return current.next();
2109+
}
2110+
}
21032111
}

0 commit comments

Comments
 (0)