Tôi muốn sao chép một luồng Java 8 để tôi có thể xử lý nó hai lần. Tôi có thể collect
làm danh sách và nhận các luồng mới từ đó;
// doSomething() returns a stream
List<A> thing = doSomething().collect(toList());
thing.stream()... // do stuff
thing.stream()... // do other stuff
Nhưng tôi nghĩ rằng nên có một cách hiệu quả / thanh lịch hơn.
Có cách nào để sao chép luồng mà không chuyển luồng đó thành một bộ sưu tập không?
Tôi thực sự đang làm việc với một luồng Either
s, vì vậy muốn xử lý hình chiếu bên trái theo một cách trước khi chuyển sang hình chiếu bên phải và xử lý theo cách khác. Kiểu như thế này (mà cho đến nay, tôi buộc phải sử dụng toList
thủ thuật với).
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 -> ... );