Lọc các phần tử trong collection với Stream Filter()

Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu làm sao để lọc các phần tử trong Stream bởi các điều kiện được chỉ định. Ngoài ra, chúng ta sẽ kết hợp filter() với một số Stream method khác để đạt được kết quả cuối cùng.

Sử dụng Stream.filter()

filter() method là một intermediate operation, cho phép chúng ta lọc các phần tử thoả các điều kiện được chỉ định. filter() method nhận 1 implement của Predicate functional interface như là một triển khai điều kiện lọc.

Stream<T> filter(Predicate<? super T> predicate)

Giả sử chúng ta có class Customer

public class Customer {
    private String name;
    private int points;
    //Constructor and standard getters
}
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<Customer> customers = Arrays.asList(john, sarah, charles, mary);

Filter Collections

Trong đa số trường hợp, filter() method được sử dụng để lọc các phần tử trong các collection. Ví dụ lấy ra danh sách các Customerpoints trên 100. Để làm được điều này, chúng ta cần kết hợp filter() để lọc các Customerpoints trên 100 là Collectors.toList() để trả về một List Customer thoả điều kiện.

List<Customer> customersWithMoreThan100Points = customers
  .stream()
  .filter(c -> c.getPoints() > 100)
  .collect(Collectors.toList());

Fillter Collection kết hợp nhiều điều kiện

Chúng ta có thể kết hợp nhiều điều kiện với nhau khi triển khai Predicate interface. Miễn là trả về kết quả TRUE or FALSE để filter() xác nhận mỗi phần tử có thoả mãn điều kiện hay không.

List<Customer> charlesWithMoreThan100Points = customers
  .stream()
  .filter(c -> c.getPoints() > 100 && c.getName().startsWith("Charles"))
  .collect(Collectors.toList());

Đếm số lượng các phần tử thoả điều kiện

Đôi lúc, chúng ta chỉ cần đếm số lượng phần tử thoả mãn điều kiện mà không cần nhận kết quả trả về là các object để xử lý gì thêm. Trong trường hợp này, chúng ta chỉ cần kết hợp filter()count() method.

int size = customers
  .stream()
  .filter(c -> c.getPoints() > 100)
  .count();

Tóm lược

Trong các hoạt động liên quan đến Stream API, filter() method là một trong những method được sử dụng với tần suất rất cao, nêm các bạn hãy đọc thật kỹ để sử dụng thành thạo method này nha. Tuy nhiên nhớ rằng filter() là một intermediate operation nên nó không thể đi lẽ loi một mình mà phải kết hợp với các terminal operation để có được kết quả cuối cùng.

Nguồn tham khảo

https://www.baeldung.com/java-stream-filter-count

https://www.baeldung.com/java-stream-filter-lambda

5 2 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x