Menghitung Padanan pada Penapis Aliran

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan meneroka penggunaan kaedah Stream.count () . Secara khusus, kita akan melihat bagaimana kita dapat menggabungkan kaedah hitungan () dengan kaedah filter () untuk menghitung padanan Predikat yang telah kita terapkan.

2. Menggunakan Stream.count ()

Kaedah kiraan () itu sendiri memberikan fungsi yang kecil tetapi sangat berguna. Kami juga dapat menggabungkannya dengan sangat baik dengan alat lain, misalnya dengan Stream.filter () .

Mari gunakan kelas Pelanggan yang sama seperti yang kami tentukan dalam tutorial kami untuk Stream.filter () :

public class Customer { private String name; private int points; //Constructor and standard getters }

Di samping itu, kami juga membuat koleksi pelanggan yang sama:

Customer john = new Customer("John P.", 15); Customer sarah = new Customer("Sarah M.", 200); Customer charles = new Customer("Charles B.", 150); Customer mary = new Customer("Mary T.", 1); List customers = Arrays.asList(john, sarah, charles, mary);

Seterusnya, kami akan menggunakan kaedah Aliran pada senarai untuk menyaringnya dan menentukan berapa banyak padanan yang diperoleh penapis kami.

2.1. Mengira Elemen

Mari lihat penggunaan kiraan yang sangat asas () :

long count = customers.stream().count(); assertThat(count).isEqualTo(4L);

Perhatikan bahawa kiraan () mengembalikan nilai panjang .

2.2. Menggunakan kiraan () Dengan penapis ()

Contoh dalam subseksyen sebelumnya tidak begitu mengagumkan. Kita boleh mendapatkan hasil yang sama dengan kaedah List.size () .

Stream.count () benar-benar bersinar apabila kita menggabungkannya dengan kaedah Stream yang lain - paling kerap dengan filter () :

long countBigCustomers = customers .stream() .filter(c -> c.getPoints() > 100) .count(); assertThat(countBigCustomers).isEqualTo(2L);

Dalam contoh ini, kami telah menggunakan penapis pada senarai pelanggan, dan kami juga memperoleh jumlah pelanggan yang memenuhi syarat tersebut. Dalam kes ini, kami mempunyai dua pelanggan dengan lebih dari 100 mata.

Sudah tentu, ini juga berlaku bahawa tidak ada unsur yang sesuai dengan penapis kami:

long count = customers .stream() .filter(c -> c.getPoints() > 500) .count(); assertThat(count).isEqualTo(0L); 

2.3. Menggunakan kiraan () Dengan Penapis Lanjutan

Dalam tutorial kami mengenai penapis () , kami melihat beberapa kes penggunaan kaedah yang lebih maju. Sudah tentu, kita masih boleh mengira hasil operasi penapis () tersebut .

Kami dapat menapis koleksi dengan pelbagai kriteria:

long count = customers .stream() .filter(c -> c.getPoints() > 10 && c.getName().startsWith("Charles")) .count(); assertThat(count).isEqualTo(1L);

Di sini, kami menyaring dan menghitung jumlah pelanggan yang namanya bermula dengan "Charles" dan yang mempunyai lebih dari 10 mata.

Kami juga dapat mengekstrak kriteria ke dalam kaedahnya sendiri dan menggunakan rujukan kaedah:

long count = customers .stream() .filter(Customer::hasOverHundredPoints) .count(); assertThat(count).isEqualTo(2L);

3. Kesimpulannya

Dalam artikel ini, kami melihat beberapa contoh cara menggunakan kaedah kiraan () dalam kombinasi dengan kaedah penapis () untuk memproses aliran. Untuk kes penggunaan kiraan lebih lanjut () , periksa kaedah lain yang mengembalikan Aliran , seperti yang ditunjukkan dalam tutorial kami mengenai penggabungan aliran dengan concat () .

Seperti biasa, kod lengkap boleh didapati di GitHub.