166

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

要素が 2 つのストリームの要素を結合した結果である、遅延したシーケンシャル結合ストリームを作成します。

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

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

私が念頭に置いているアプリケーションは、この Java 実装の 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 の機能を使用しない)。

4

14 に答える 14

28

ラムダ ( gist ) で JDK8 を使用して 2 つのストリームを圧縮します。

public static <A, B, C> Stream<C> zip(Stream<A> streamA, Stream<B> streamB, BiFunction<A, B, C> zipper) {
    final Iterator<A> iteratorA = streamA.iterator();
    final Iterator<B> iteratorB = streamB.iterator();
    final Iterator<C> iteratorC = new Iterator<C>() {
        @Override
        public boolean hasNext() {
            return iteratorA.hasNext() && iteratorB.hasNext();
        }

        @Override
        public C next() {
            return zipper.apply(iteratorA.next(), iteratorB.next());
        }
    };
    final boolean parallel = streamA.isParallel() || streamB.isParallel();
    return iteratorToFiniteStream(iteratorC, parallel);
}

public static <T> Stream<T> iteratorToFiniteStream(Iterator<T> iterator, boolean parallel) {
    final Iterable<T> iterable = () -> iterator;
    return StreamSupport.stream(iterable.spliterator(), parallel);
}
于 2015-09-01T22:59:50.637 に答える
7

Lazy-Seq ライブラリは、zip 機能を提供します。

https://github.com/nurkiewicz/LazySeq

このライブラリはscala.collection.immutable.Stream、不変で、スレッドセーフで、使いやすい遅延シーケンスの実装 (おそらく無限) に大きく影響を受け、それを提供することを目的としています。

于 2013-10-22T20:33:02.570 に答える
2
public class Tuple<S,T> {
    private final S object1;
    private final T object2;

    public Tuple(S object1, T object2) {
        this.object1 = object1;
        this.object2 = object2;
    }

    public S getObject1() {
        return object1;
    }

    public T getObject2() {
        return object2;
    }
}


public class StreamUtils {

    private StreamUtils() {
    }

    public static <T> Stream<Tuple<Integer,T>> zipWithIndex(Stream<T> stream) {
        Stream<Integer> integerStream = IntStream.range(0, Integer.MAX_VALUE).boxed();
        Iterator<Integer> integerIterator = integerStream.iterator();
        return stream.map(x -> new Tuple<>(integerIterator.next(), x));
    }
}
于 2015-08-07T15:14:03.030 に答える