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