小编典典
我也需要它,因此我只是从b93中获取了源代码并将其放在“ util”类中。我必须对其稍作修改以使用当前的API。
供参考,以下是工作代码(风险自负…):
public static Stream zip(Stream extends A> a,
Stream extends B> b,
BiFunction super A, ? super B, ? extends C> zipper) {
Objects.requireNonNull(zipper);
Spliterator extends A> aSpliterator = Objects.requireNonNull(a).spliterator();
Spliterator extends B> bSpliterator = Objects.requireNonNull(b).spliterator();
// Zipping looses DISTINCT and SORTED characteristics
int characteristics = aSpliterator.characteristics() & bSpliterator.characteristics() &
~(Spliterator.DISTINCT | Spliterator.SORTED);
long zipSize = ((characteristics & Spliterator.SIZED) != 0)
? Math.min(aSpliterator.getExactSizeIfKnown(), bSpliterator.getExactSizeIfKnown())
: -1;
Iterator aIterator = Spliterators.iterator(aSpliterator);
Iterator bIterator = Spliterators.iterator(bSpliterator);
Iterator cIterator = new Iterator() {
@Override
public boolean hasNext() {
return aIterator.hasNext() && bIterator.hasNext();
}
@Override
public C next() {
return zipper.apply(aIterator.next(), bIterator.next());
}
};
Spliterator split = Spliterators.spliterator(cIterator, zipSize, characteristics);
return (a.isParallel() || b.isParallel())
? StreamSupport.stream(split, true)
: StreamSupport.stream(split, false);
}
2020-10-26