2回処理できるように、Java 8ストリームを複製したいと思います。私ができるcollect
ことから、新たなストリームを取得し、リストのように。
// doSomething() returns a stream
List<A> thing = doSomething().collect(toList());
thing.stream()... // do stuff
thing.stream()... // do other stuff
しかし、もっと効率的でエレガントな方法があるべきだと思います。
コレクションに変換せずにストリームをコピーする方法はありますか?
私は実際にはEither
sのストリームで作業しているので、右のプロジェクションに移動して別の方法で処理する前に、左のプロジェクションを1つの方法で処理したいとします。このようなもの(これまでのところ、私はtoList
トリックを使用することを余儀なくされています)。
List<Either<Pair<A, Throwable>, A>> results = doSomething().collect(toList());
Stream<Pair<A, Throwable>> failures = results.stream().flatMap(either -> either.left());
failures.forEach(failure -> ... );
Stream<A> successes = results.stream().flatMap(either -> either.right());
successes.forEach(success -> ... );