使用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个赞
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);}
绝地无双
TA贡献1946条经验 获得超4个赞
返回一个流,其中每个元素都是将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) { ... } }
添加回答
举报
0/150
提交
取消