Pemfilteran LongStream [duplikat]

Dec 01 2020

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

1 NikolasCharalambidis Dec 01 2020 at 13:59

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 stream1alih - alih stream2, maka:

stream2 = stream2.filter(e -> stream1.contains(e));

Satu-satunya cara adalah membandingkan LongStreamdengan koleksi yang dioptimalkan untuk pencarian semacam itu. Saya berasumsi Anda ingin melanjutkan stream1setelah Anda melakukan pencarian, jadi lakukan langkah-langkah ini:

  1. Tutup stream1mengubahnya menjadi List<Long> list1.
  2. Lakukan pencarian dengan stream2menggunakan list1dari stream1.
  3. Buka stream1kembali 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 Setuntuk kinerja yang lebih baik seperti yang disarankan @ fps dalam jawabannya .

3 fps Dec 01 2020 at 13:48

Anda dapat mengumpulkan untuk Setdan menggunakan contains:

LongStream stream1 = ...
LongStream stream2 = ...

Set<Long> set1 = stream1.boxed().collect(Collectors.toSet());

stream2 = stream2.filter(set1::contains);
1 UsagiMiyamoto Dec 01 2020 at 14:17

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 ...)