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

使用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的功能)。


互换的青春
浏览 1473回答 3
3回答

慕婉清6462132

我也需要这个,所以我把b93的源代码放到了一个“util”类中。为了使用当前的API,我不得不稍微修改它。作为参考,以下是工作代码(冒着自己的风险.):public&nbsp;static<A,&nbsp;B,&nbsp;C>&nbsp;Stream<C>&nbsp;zip(Stream<?&nbsp;extends&nbsp;A>&nbsp;a, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stream<?&nbsp;extends&nbsp;B>&nbsp;b, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BiFunction<?&nbsp;super&nbsp;A,&nbsp;?&nbsp;super&nbsp;B,&nbsp;?&nbsp;extends&nbsp;C>&nbsp;zipper)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;Objects.requireNonNull(zipper); &nbsp;&nbsp;&nbsp;&nbsp;Spliterator<?&nbsp;extends&nbsp;A>&nbsp;aSpliterator&nbsp;=&nbsp;Objects.requireNonNull(a).spliterator(); &nbsp;&nbsp;&nbsp;&nbsp;Spliterator<?&nbsp;extends&nbsp;B>&nbsp;bSpliterator&nbsp;=&nbsp;Objects.requireNonNull(b).spliterator(); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Zipping&nbsp;looses&nbsp;DISTINCT&nbsp;and&nbsp;SORTED&nbsp;characteristics &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;characteristics&nbsp;=&nbsp;aSpliterator.characteristics()&nbsp;&&nbsp;bSpliterator.characteristics()&nbsp;& &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~(Spliterator.DISTINCT&nbsp;|&nbsp;Spliterator.SORTED); &nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;zipSize&nbsp;=&nbsp;((characteristics&nbsp;&&nbsp;Spliterator.SIZED)&nbsp;!=&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?&nbsp;Math.min(aSpliterator.getExactSizeIfKnown(),&nbsp;bSpliterator.getExactSizeIfKnown()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;-1; &nbsp;&nbsp;&nbsp;&nbsp;Iterator<A>&nbsp;aIterator&nbsp;=&nbsp;Spliterators.iterator(aSpliterator); &nbsp;&nbsp;&nbsp;&nbsp;Iterator<B>&nbsp;bIterator&nbsp;=&nbsp;Spliterators.iterator(bSpliterator); &nbsp;&nbsp;&nbsp;&nbsp;Iterator<C>&nbsp;cIterator&nbsp;=&nbsp;new&nbsp;Iterator<C>()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;hasNext()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;aIterator.hasNext()&nbsp;&&&nbsp;bIterator.hasNext(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;C&nbsp;next()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;zipper.apply(aIterator.next(),&nbsp;bIterator.next()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;Spliterator<C>&nbsp;split&nbsp;=&nbsp;Spliterators.spliterator(cIterator,&nbsp;zipSize,&nbsp;characteristics); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(a.isParallel()&nbsp;||&nbsp;b.isParallel()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?&nbsp;StreamSupport.stream(split,&nbsp;true) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;StreamSupport.stream(split,&nbsp;false);}

绝地无双

如果项目中有番石榴,则可以使用Streams.zip方法(在番石榴21中添加):返回一个流,其中每个元素都是将Streama和StreamB的对应元素传递给函数的结果。生成的流只需两个输入流中较短的一个;如果一个流较长,则它的额外元素将被忽略。结果流不能有效拆分。这可能会损害并行性能。&nbsp;public&nbsp;class&nbsp;Streams&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;<A,&nbsp;B,&nbsp;R>&nbsp;Stream<R>&nbsp;zip(Stream<A>&nbsp;streamA, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stream<B>&nbsp;streamB,&nbsp;BiFunction<?&nbsp;super&nbsp;A,&nbsp;?&nbsp;super&nbsp;B,&nbsp;R>&nbsp;function)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java