Pemfilteran LongStream [duplikat]
Saya memiliki dua Java LongStreams dan saya ingin menghapus nilai yang ada di satu aliran dari yang lain.
LongStream stream 1 = ...
LongStream stream 2 = ...
stream2 = stream2.filter(e-> stream1.contains(e));
LongStream tidak memiliki metode berisi dan saya tidak tahu bagaimana menggunakan anyMatch dalam kasus ini karena nilai yang akan diperiksa berasal dari aliran lain dan tidak dalam variabel atau konstanta.
Jawaban
Nah, Anda tidak dapat mencari di Stream selama Stream adalah rangkaian pipeline yang belum selesai, misalnya operasi. Tidak masuk akal untuk membandingkannya dengan Arus seperti itu.
Hal berikutnya yang tampak aneh bagi saya mungkin salah ketik. Saya berasumsi Anda ingin mencari di stream1
alih - alih stream2
, maka:
stream2 = stream2.filter(e -> stream1.contains(e));
Satu-satunya cara adalah membandingkan LongStream
dengan koleksi yang dioptimalkan untuk pencarian semacam itu. Saya berasumsi Anda ingin melanjutkan stream1
setelah Anda melakukan pencarian, jadi lakukan langkah-langkah ini:
- Tutup
stream1
mengubahnya menjadiList<Long> list1
. - Lakukan pencarian dengan
stream2
menggunakanlist1
daristream1
. - Buka
stream1
kembali untuk diproses lebih lanjut.
LongStream stream1 = ...
LongStream stream2 = ...
List<Long> list1 = stream1.boxed() // list1 from stream1 ..
.collect(Collectors.toList()); // .. which also closes stream1
stream2 = stream2.filter(list1::contains); // perform search
stream1 = list1.stream().mapToLong(l -> l); // open stream1 as LongStream
Edit: Gunakan Set
untuk kinerja yang lebih baik seperti yang disarankan @ fps dalam jawabannya .
Anda dapat mengumpulkan untuk Set
dan menggunakan contains
:
LongStream stream1 = ...
LongStream stream2 = ...
Set<Long> set1 = stream1.boxed().collect(Collectors.toSet());
stream2 = stream2.filter(set1::contains);
Mengapa menggunakan aliran sama sekali?
Koleksi memiliki retainAll(Collection)metode, yang melakukan apa yang Anda butuhkan, jika saya tidak salah ...
(Atau removeAll(Collection)
hanya sedikit di atas ...)