Bir Java 8 akışını kopyalamak istiyorum, böylece onunla iki kez ilgilenebilirim. collect
Liste olarak yapabilirim ve bundan yeni akışlar alabilirim;
// doSomething() returns a stream
List<A> thing = doSomething().collect(toList());
thing.stream()... // do stuff
thing.stream()... // do other stuff
Ama daha verimli / zarif bir yol olması gerektiğini düşünüyorum.
Akışı bir koleksiyona dönüştürmeden kopyalamanın bir yolu var mı?
Aslında bir Either
s akışı ile çalışıyorum , bu yüzden sol izdüşümü sağ projeksiyona geçmeden ve bununla başka bir şekilde ilgilenmeden önce bir şekilde işlemek istiyorum. Bunun gibi (ki şimdiye kadar toList
hileyi kullanmak zorunda kaldım ).
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 -> ... );