Stream a = Stream.of(\"one\", \"three\", \"five\");
Stream b = Stream.of(\"two\", \"four\", \"six\");
What do I need
As you can see from the question comments, I gave this a go using zip:
Stream a = Stream.of("one", "three", "five");
Stream b = Stream.of("two", "four", "six");
Stream out = interleave(a, b);
public static Stream interleave(Stream streamA, Stream streamB) {
return zip(streamA, streamB, (o1, o2) -> Stream.of(o1, o2)).flatMap(s -> s);
}
/**
* https://stackoverflow.com/questions/17640754/zipping-streams-using-jdk8-with-lambda-java-util-stream-streams-zip
**/
private static Stream zip(Stream streamA, Stream streamB, BiFunction zipper) {
final Iterator iteratorA = streamA.iterator();
final Iterator iteratorB = streamB.iterator();
final Iterator iteratorC = new Iterator() {
@Override
public boolean hasNext() {
return iteratorA.hasNext() && iteratorB.hasNext();
}
@Override
public C next() {
return zipper.apply(iteratorA.next(), iteratorB.next());
}
};
final boolean parallel = streamA.isParallel() || streamB.isParallel();
return iteratorToFiniteStream(iteratorC, parallel);
}
private static Stream iteratorToFiniteStream(Iterator iterator, boolean parallel) {
final Iterable iterable = () -> iterator;
return StreamSupport.stream(iterable.spliterator(), parallel);
}