У меня есть некоторый код, который возвращает поток, как и предполагалось, но, возможно, его можно заменить каким-либо типом лямбда-операции или операции 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;
}
}
Stream.generate(() -> null).takewhile(iteratorFirst.hasNext() && iteratorSecond.hasNext()).flatMap(ignored -> Stream.of(iteratorFirst.next(), iteratorSecond.next()))
может подойти, но я не думаю, что это более читабельно, чем ваше существующее решение. - person Jaroslaw Pawlak   schedule 16.07.2018StreamSupport.stream(iteratorFirst.spliterator(), false).filter(element -> iteratorSecond.hasNext()).flatMap(element -> Stream.of(element, iteratorSecond.next()))
, но это снова нарушает контракт, так какPredicate
должен быть без гражданства. - person Jaroslaw Pawlak   schedule 16.07.2018