Menghitung Kecocokan di Filter Aliran

1. Ikhtisar

Dalam tutorial ini, kita akan menjelajahi penggunaan metode Stream.count () . Secara khusus, kita akan melihat bagaimana kita bisa menggabungkan metode count () dengan metode filter () untuk menghitung kecocokan dari Predikat yang telah kita terapkan.

2. Menggunakan Stream.count ()

Metode count () itu sendiri menyediakan fungsionalitas yang kecil tapi sangat berguna. Kami juga dapat menggabungkannya dengan sangat baik dengan alat lain, misalnya dengan Stream.filter () .

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

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

Selain 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);

Selanjutnya, kami akan menerapkan metode Aliran pada daftar untuk memfilternya dan menentukan berapa banyak kecocokan yang didapat filter kami.

2.1. Menghitung Elemen

Mari kita lihat penggunaan count () yang paling dasar :

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

Perhatikan bahwa count () mengembalikan nilai panjang .

2.2. Menggunakan count () Dengan filter ()

Contoh di sub-bagian sebelumnya tidak terlalu mengesankan. Kita bisa mendapatkan hasil yang sama dengan metode List.size () .

Stream.count () benar-benar bersinar ketika kita menggabungkannya dengan metode Stream lainnya - paling sering dengan filter () :

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

Dalam contoh ini, kami telah menerapkan filter pada daftar pelanggan, dan kami juga telah memperoleh jumlah pelanggan yang memenuhi ketentuan tersebut. Dalam hal ini, kami memiliki dua pelanggan dengan lebih dari 100 poin.

Tentu saja, bisa juga terjadi bahwa tidak ada elemen yang cocok dengan filter kami:

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

2.3. Menggunakan count () Dengan Filter Lanjutan

Dalam tutorial kami tentang filter () , kami melihat beberapa kasus penggunaan lanjutan dari metode ini. Tentu saja, kita masih bisa menghitung hasil dari operasi filter () tersebut.

Kami dapat memfilter koleksi dengan beberapa kriteria:

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

Di sini, kami memfilter dan menghitung jumlah pelanggan yang namanya dimulai dengan "Charles" dan yang memiliki lebih dari 10 poin.

Kami juga dapat mengekstrak kriteria ke dalam metodenya sendiri dan menggunakan referensi metode:

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

3. Kesimpulan

Dalam artikel ini, kami melihat beberapa contoh cara menggunakan metode count () yang dikombinasikan dengan metode filter () untuk memproses aliran. Untuk kasus penggunaan count () lebih lanjut , lihat metode lain yang mengembalikan Stream , seperti yang ditunjukkan dalam tutorial kami tentang menggabungkan aliran dengan concat () .

Seperti biasa, kode lengkap tersedia di GitHub.