Я попытался реализовать универсальный метод, который возвращает сжатый поток из двух потоков. Возвращаемый поток должен быть объединением двух потоков, в которых элементы появляются по очереди, и основываться на двух потоках, которые передаются этому методу. Если один поток длиннее другого, он должен содержать значения из более длинного потока в конце. Код, который я придумал:
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Stream;
public class Task12 {
public static void main(String[] args) {
Stream<Integer> stream1 = Stream.iterate(0, integer -> integer)
.limit(20);
Stream<Integer> stream2 = Stream.iterate(1, integer -> integer)
.limit(20);
Stream<Integer> zippedStreams = zip(stream1, stream2);
zippedStreams.forEach(System.out::println);
}
private static <T> Stream<T> zip(Stream<T> first, Stream<T> second) {
Iterator<T> iterator1 = first.iterator();
Iterator<T> iterator2 = second.iterator();
List<T> elements = new LinkedList<>();
while (iterator1.hasNext() || iterator2.hasNext()) {
if (iterator1.hasNext()) {
elements.add(iterator1.next());
}
if(iterator2.hasNext()) {
elements.add(iterator2.next());
}
}
return elements.stream();
}
У меня есть несколько вопросов об этой реализации:
- есть ли лучший способ реализовать это?
- что если один из потоков будет бесконечным потоком? Есть ли способ ограничить возвращаемый поток точным количеством элементов - кроме использования метода «limit» и передачи лимита в качестве параметра для метода «zip»?