У меня есть код, который возвращает Stream, как и предполагалось, но, возможно, его можно заменить каким-либо типом операции лямбда или stream () вместо того, чтобы исчерпывать итераторы в цикле while?
Это просто метод, который чередует элементы из потоков first и second и останавливается, когда в одном из них заканчиваются элементы.
public static <T>Stream<T> alternatingSequence(Stream<T> first, Stream<T> second){
Iterator<T> iteratorFirst = first.iterator();
Iterator<T> iteratorSecond = second.iterator();
Stream<T> resultStream = Stream.empty();
while (iteratorFirst.hasNext() && iteratorSecond.hasNext()){
resultStream = Stream.concat(resultStream, Stream.of(iteratorFirst.next(), iteratorSecond.next()));
}
return resultStream;
}
}
Вы меняете два итератора?
Использование Java Stream API. Может, этот код нельзя заменить лямбда-выражением?
Просто метод, который чередует элементы из первого и второго потоков и останавливается, когда в одном из них заканчиваются элементы.
ах, значит, вы собираетесь объединить два потока (a1, a2 ...) и (b1, b2 ...) и вернуть чередование (a1, b1, a2, b2 ...)? и, по-видимому, вы хотите ленивую оценку следующих элементов, я прав?
Возможный дубликат Архивирование потоков с использованием JDK8 с лямбда-выражением (java.util.stream.Streams.zip)
@PatrickParker Изменил это давно.
Что-то вроде Stream.generate(() -> null).takewhile(iteratorFirst.hasNext() && iteratorSecond.hasNext()).flatMap(ignored -> Stream.of(iteratorFirst.next(), iteratorSecond.next())) могло бы сделать, но я не думаю, что это более читабельно, чем ваше существующее решение.
Или StreamSupport.stream(iteratorFirst.spliterator(), false).filter(element -> iteratorSecond.hasNext()).flatMap(element -> Stream.of(element, iteratorSecond.next())), но это снова нарушает договор, так как Predicate должен быть без гражданства.
Я должен использовать только Java8, поэтому takeWhile не подходит для меня. Как его заменить на Java8?
@ Сергей Какой именно выход вам нужен?
Первый поток [«A», «B», «C», «D»], второй поток [«1», «2», «3»], вывод потока [«A», «1», «B» , «2», «C», «3»], например.
@ Сергей был ли на ваш вопрос успешно дан ответ?




Используя Streams.zip Гуавы, вы можете объединить два потока в поток из двухэлементных потоков, который затем вы можете просто сгладить для создания чередующейся последовательности:
return Streams.zip(first, second, (arg1, arg2) -> Stream.of(arg1, arg2))
.flatMap(Function.identity());
Одно предостережение заключается в том, что результирующий поток не может быть эффективно разделен (см. Связанный документ). Это может повредить параллельную производительность.
Примечание:
Если у вас нет доступа к Guava, вы можете реализовать свой собственный zip(a, b, bifunc), как показано здесь.
Может быть, вы также включите то, что должен делать этот код, вместо того, чтобы оставлять читателю самим понять это.