为了账号安全,请及时绑定邮箱和手机立即绑定

使用JDK 8和lambda压缩流(java.util.Streams.zip)

使用JDK 8和lambda压缩流(java.util.Streams.zip)

互换的青春 2019-06-16 16:26:35
使用JDK 8和lambda压缩流(java.util.Streams.zip)在JDK 8和lambda b93中,有一个类b93中的java.util.Streams.zip可以用来压缩流(在本教程中说明了这一点)。探索Java 8 lambdas。第一部分:Dhananjay Nene)。这一职能:创建一个延迟和顺序组合的流,其元素是合并两个流的元素的结果。然而,在B98中,这种情况已经消失。事实上Streams类甚至无法访问B98中的java.util.Stream.该功能是否已被移动,如果是,我如何使用B98简洁地压缩流?我想到的应用程序是在这个java实现中中的zip功能。static <T> boolean every(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred)static <T> T find(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred)函数具有相当冗长的代码(它不使用来自B98的功能)。
查看完整描述

3 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

我也需要这个,所以我把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);}


查看完整回答
反对 回复 2019-06-16
?
绝地无双

TA贡献1946条经验 获得超4个赞

如果项目中有番石榴,则可以使用Streams.zip方法(在番石榴21中添加):

返回一个流,其中每个元素都是将Streama和StreamB的对应元素传递给函数的结果。生成的流只需两个输入流中较短的一个;如果一个流较长,则它的额外元素将被忽略。结果流不能有效拆分。这可能会损害并行性能。

 public class Streams {
     ...

     public static <A, B, R> Stream<R> zip(Stream<A> streamA,
             Stream<B> streamB, BiFunction<? super A, ? super B, R> function) {
         ...
     }
 }


查看完整回答
反对 回复 2019-06-16
  • 3 回答
  • 0 关注
  • 1465 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信