1. ホーム
  2. lambda

[解決済み] JDK8でlambdaを使ってストリームをZIPする (java.util.stream.Streams.zip)

2022-04-24 12:29:57

質問

JDK 8 でラムダ b93 を使用する場合、クラスがありました。 java.util.stream.Streams.zip は b93 に含まれます。 これはストリームの圧縮に使用できます (これはチュートリアルで説明されています。 Java8 Lambdasを探求する。パート1 by Dhananjay Nene ). この関数は :

遅延かつ連続した結合Streamを作成する。 2つのストリームの要素を結合した結果である。

しかし、b98ではこれがなくなりました。実際には Streams クラスにはアクセスできません。 b98 の java.util.stream .

この機能は移動されたのでしょうか?もしそうなら、b98 を使ってストリームを簡潔に圧縮するにはどうすればよいのでしょうか?

私が考えているアプリケーションは このShenの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の機能は使っていない)を追加しました。

解決方法は?

私もこれが必要だったので、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);
}