Copier un cours d'eau pour éviter les “flux " a déjà été opéré ou fermée”

Je voudrais dupliquer un Java 8 flux de sorte que je peux faire face à deux fois. Je peux collect comme une liste et d'obtenir un nouveau flux de ce;

//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 une plus efficace/de manière élégante.

Est-il un moyen de copier le flux sans le transformer en une collection?

Je suis en train de travailler avec un flux de Eithers, de sorte que veux processus de la gauche de la projection d'une façon avant le déplacement sur la droite de projection et de traiter avec celui d'une autre manière. Un peu comme cela (qui, jusqu'à présent, je suis obligé d'utiliser le toList truc avec).

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 -> ... );
  • Pourriez-vous donner plus de détails sur le processus "d'une manière"... êtes-vous de consommer des objets? Cartographie eux? partitionBy() et groupingBy (), vous pouvez obtenir directement à 2+ de listes, mais vous pourriez bénéficier de la cartographie d'abord ou tout simplement d'avoir une décision de la fourche dans votre forEach().
InformationsquelleAutor Toby | 2014-05-25