Eu gostaria de duplicar um fluxo do Java 8 para poder lidar com ele duas vezes. Eu posso collect
como uma lista e obter novos fluxos a partir disso;
// doSomething() returns a stream
List<A> thing = doSomething().collect(toList());
thing.stream()... // do stuff
thing.stream()... // do other stuff
Mas acho que deveria haver uma maneira mais eficiente / elegante.
Existe uma maneira de copiar o fluxo sem transformá-lo em uma coleção?
Na verdade, estou trabalhando com um fluxo de Either
s, então, quero processar a projeção esquerda de uma maneira antes de passar para a projeção direita e lidar com essa outra maneira. Mais ou menos assim (com o qual até agora sou forçado a usar o toList
truque).
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 -> ... );