JDK8 でラムダを使用してストリームを圧縮する (java.util.stream.Streams.zip) 質問する

JDK8 でラムダを使用してストリームを圧縮する (java.util.stream.Streams.zip) 質問する

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

2 つのストリームの要素を結合した結果を要素とする遅延および順次結合ストリームを作成します。

しかし、b98ではこれが消えてしまいました。実際、このStreamsクラスはb98 の java.util.stream

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

私が考えているアプリケーションはこの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 の機能は使用しません)。

ベストアンサー1

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

おすすめ記事