Group by sử dụng Stream và Collectors trong Java

Trong SQL thì câu lệnh GROUP BY dùng để trả về một tập hợp các records giống nhau ở một tiêu chí nào đó. Ví dụ bạn có một table có chứa thông tin sinh viên, mỗi sinh viên đến từ một quốc gia khác nhau. Sử dụng câu lệnh GROUP BY theo tiêu chí quốc gia, các bạn có thể biết số sinh viên đến từ quốc gia nào đó. Tương tự như vậy từ Java 8, Java cũng hỗ trợ cho chúng ta chức năng group by. Trong bài viết này, mình sẽ hướng dẫn các bạn làm cách nào để group by sử dụng Stream và Collectors trong Java các bạn nhé!

Ví dụ, mình có danh sách sinh viên với các thông tin như sau:

Bây giờ, mình cần group danh sách sinh viên ở trên theo quốc gia và đếm số lượng sinh viên trong mỗi quốc gia.

Để làm được điều này, chúng ta sẽ sử dụng phương thức collect() trong đối tượng Stream cùng với phương thức static groupingBy() trong đối tượng Collectors của Java.

Ví dụ giờ chúng ta cần group danh sách sinh viên theo quốc gia thì chúng ta sẽ code như sau:

Kết quả:

Group by sử dụng Stream và Collectors trong Java

Trong đoạn code trên, tham số của phương thức groupingBy() sẽ là tiêu chí mà chúng ta sẽ group giống như trong SQL. Nếu các bạn muốn group theo tên sinh viên thì có thể thay thế Student::getCountry bằng Student::getName.

Như các bạn thấy, mặc định thì sau khi group xong, những phần tử nào có cùng tiêu chí sẽ nằm trong một List object, chúng ta có thể thay đổi điều này bằng cách truyền thêm một tham số nữa vào phương thức groupingBy() của đối tượng Collectors. Ví dụ như, giờ mình muốn những phần tử nào có cùng tiêu chí sẽ nằm trong một Set object thì mình sẽ code như sau:

Kết quả:

Group by sử dụng Stream và Collectors trong Java

Thêm nữa, nếu sau khi group xong, các bạn muốn đếm số lượng sinh viên của mỗi quốc gia thì hãy sẽ sử dụng phương thức groupingBy như sau:

Ở đây, mình đã sử dụng thêm một phương thức khác của đối tượng Collectors tên là counting() để đếm số lượng sinh viên theo mỗi quốc gia mà mình muốn.

Kết quả:

Group by sử dụng Stream và Collectors trong Java

 

Chia sẽ bài viết này ...Share on Facebook
Facebook
0Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin

Add Comment