Я хотів би дублювати потік 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 -> ... );