Я бы хотел дублировать поток Java 8, чтобы я мог справиться с ним дважды. Я могу collect
в виде списка и получать из него новые потоки;
// doSomething() returns a stream
List<A> thing = doSomething().collect(toList());
thing.stream()... // do stuff
thing.stream()... // do other stuff
Но я думаю, что должен быть более эффективный/элегантный способ.
Есть ли способ скопировать поток, не превращая его в коллекцию?
Я на самом деле работаю с потоком Either
s, поэтому хочу обработать левую проекцию в одну сторону, прежде чем двигаться на правый проектор и иметь дело с этим другим способом. Вид вроде этого (который, до сих пор, я вынужден использовать трюк 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 -> ... );