使用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
提交
取消
