ฉันต้องการทำสตรีม Java 8 ซ้ำเพื่อที่ฉันจะได้จัดการกับมันสองครั้ง ฉันสามารถcollect
เป็นรายการและรับสตรีมใหม่จากสิ่งนั้น
// doSomething() returns a stream
List<A> thing = doSomething().collect(toList());
thing.stream()... // do stuff
thing.stream()... // do other stuff
แต่ฉันคิดว่าควรมีวิธีที่มีประสิทธิภาพ / สง่างามกว่านี้
มีวิธีคัดลอกสตรีมโดยไม่เปลี่ยนเป็นคอลเล็กชันหรือไม่?
ฉันกำลังทำงานกับสตรีมของEither
s จริงๆดังนั้นต้องการประมวลผลการฉายภาพด้านซ้ายทางเดียวก่อนที่จะย้ายไปยังการฉายภาพด้านขวาและจัดการด้วยวิธีอื่น แบบนี้ (ซึ่งจนถึงตอนนี้ฉันบังคับให้ใช้toList
เคล็ดลับด้วย)
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 -> ... );