Je voudrais dupliquer un flux Java 8 pour pouvoir le gérer deux fois. Je peux collect
comme liste et obtenir de nouveaux flux à partir de cela;
// doSomething() returns a stream
List<A> thing = doSomething().collect(toList());
thing.stream()... // do stuff
thing.stream()... // do other stuff
Mais je pense qu'il devrait y avoir un moyen plus efficace / élégant.
Existe-t-il un moyen de copier le flux sans le transformer en collection?
Je travaille en fait avec un flux de Either
s, je veux donc traiter la projection de gauche dans un sens avant de passer à la projection de droite et de traiter cette autre manière. Un peu comme ça (avec lequel, jusqu'à présent, je suis obligé d'utiliser l' toList
astuce).
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 -> ... );