使用带有Lambda的JDK8压缩流(java.util.stream.Streams.zip)

使用带有Lambda的JDK8压缩流(java.util.stream.Streams.zip),第1张

使用带有Lambda的JDK8压缩流(java.util.stream.Streams.zip)

我也需要它,因此我只是从b93中获取了源代码并将其放在“ util”类中。我必须对其稍作修改以使用当前的API。

供参考,以下是工作代码(风险自负…):

public static<A, B, C> Stream<C> 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<A> aIterator = Spliterators.iterator(aSpliterator);    Iterator<B> bIterator = Spliterators.iterator(bSpliterator);    Iterator<C> cIterator = new Iterator<C>() {        @Override        public boolean hasNext() { return aIterator.hasNext() && bIterator.hasNext();        }        @Override        public C next() { return zipper.apply(aIterator.next(), bIterator.next());        }    };    Spliterator<C> split = Spliterators.spliterator(cIterator, zipSize, characteristics);    return (a.isParallel() || b.isParallel())? StreamSupport.stream(split, true): StreamSupport.stream(split, false);}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5490169.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存