gpt4 book ai didi

lambda - 使用 JDK8 和 lambda 压缩流 (java.util.stream.Streams.zip)

转载 作者:太空宇宙 更新时间:2023-11-04 10:40:15 25 4
gpt4 key购买 nike

在带有 lambda b93 的 JDK 8 中,有一个类 java.util.stream.Streams.zip in b93它可用于压缩流(教程 Exploring Java8 Lambdas. Part 1 by Dhananjay Nene 中对此进行了说明)。这个功能:

Creates a lazy and sequential combined Stream whose elements are theresult of combining the elements of two streams.

但是在 b98 中这已经消失了。事实上Streams类甚至无法在 java.util.stream in b98 中访问.

此功能是否已移动,如果是,如何使用 b98 简洁地压缩流?

我想要的应用程序是 in this java implementation of Shen ,我在其中替换了 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 中的功能)。

最佳答案

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

关于lambda - 使用 JDK8 和 lambda 压缩流 (java.util.stream.Streams.zip),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49060847/

25 4 0