Saya ingin menduplikasi aliran Java 8 sehingga saya bisa mengatasinya dua kali. Saya bisa collect
sebagai daftar dan mendapatkan aliran baru dari itu;
// doSomething() returns a stream
List<A> thing = doSomething().collect(toList());
thing.stream()... // do stuff
thing.stream()... // do other stuff
Tapi menurut saya harus ada cara yang lebih efisien / elegan.
Adakah cara untuk menyalin aliran tanpa mengubahnya menjadi koleksi?
Saya sebenarnya bekerja dengan aliran Either
s, jadi ingin memproses proyeksi kiri dengan satu cara sebelum beralih ke proyeksi kanan dan menangani dengan cara lain. Jenis seperti ini (yang, sejauh ini, saya terpaksa menggunakan toList
trik dengan).
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 -> ... );