Vorrei duplicare uno stream Java 8 in modo da poterlo gestire due volte. Posso collect
come elenco e ottenere nuovi flussi da quello;
// doSomething() returns a stream
List<A> thing = doSomething().collect(toList());
thing.stream()... // do stuff
thing.stream()... // do other stuff
Ma penso che dovrebbe esserci un modo più efficiente / elegante.
C'è un modo per copiare lo stream senza trasformarlo in una raccolta?
In realtà sto lavorando con un flusso di Either
s, quindi voglio elaborare la proiezione sinistra in un modo prima di passare alla proiezione destra e affrontarla in un altro modo. Un po 'come questo (con cui, finora, sono costretto a usare il toList
trucco).
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 -> ... );