menu

VanThuong.Com

Blog học lập trình Java và SEO miễn phí.

Java 8 Stream API - Cách sử dụng phương thức filter()

Posted by on
Trong các bài viết trước liên quan đến Java 8, tôi đã giới thiệu đến các khá nhiều phương thức hữu ích hỗ trợ cho Streams API. Tiếp theo trong hướng dẫn này, tôi sẽ giới thiệu với các bạn chi tiết hơn về cách sử dụng phương thức filter(). Đây là một trong nhưng phương thức chủ chốt của Streams API mà bạn cần biết khi làm việc với Java 8. Tôi sẽ tạo một số ví dụ gần gũi nhất để các bạn nắm bắt cách sử dụng filter trên Collections.
Java 8 Stream API - Cách sử dụng phương thức filter

Java 8 Filter Method

Trong Java 8, phương thức filter() được định nghĩa trong Stream class và có tham số đầu vào là một đối tượng Predicate và kết quả trả về là một stream bao gồm các đối tượng của stream ban đầu phù hợp với Predicate. Nó là một thao tác trung gian, có nghĩa là bạn có thể gọi các phương thức khác của Stream ví dụ như count(), map(),... Predicate sẽ áp dụng lên tất cả các phần tử của Collection để kiểm tra xem phần tử nào sẽ được trả về trong stream kết quả.

Trong trường hợp bạn muốn filter operation (thực thi phép lọc) có thể chạy trong parallel (song song) thì có thể sử dụng parallel stream. Trong Java 8, Predicate là một functional interface sẽ trả về kết quả true/false do phương thức test(T t) thực thi dựa trên tham số đầu vào. Việc phương thức filter() chấp nhận một functional interface đồng nghĩa với việc bạn có thể truyền Predicate ở dạng Lambda expression, và chúng ta sẽ sử dụng trong các ví dụ sắp tới.

Ví dụ cách sử dụng filter trên List với stream API

Dưới đây là ví dụ đơn giản nhất để minh họa cho Java 8 Stream và phương thức filter(). Bạn có thể thấy rằng nó gần giống với việc bạn sử dụng điều kiện cho câu lệnh SQL.

Ví dụ: bạn có thể viết câu lệnh như bên dưới đây trong SQL để lọc ra tất cả các sinh viên có giới tính là MALE.
SELECT * FROM Students WHERE gender = 'MALE';
Vậy thì trong Java 8 Stream chúng ta có thể thực hiện như sau:
students.stream()
        .filter(student -> student.getGender() == GENDER.MALE)
        .forEach(System.out::println)

Trong ví dụ trên chúng ta đã truyền vào phương thức filter là một lambda expression và kết quả trả về là một giá trị boolean. Thật đơn giản để sử dụng phương thức filter của Java 8 Stream đúng không nào?

Dưới đây là tôi sẽ viết thêm một vài ví dụ khác để bạn tham khảo nhé.
com.vanthuong.example.Gender.java
package com.vanthuong.example;

public enum Gender {
  MALE, FEMALE
}

com.vanthuong.example.Student.java
package com.vanthuong.example;

import java.time.LocalDate;

/**
 * Official blog: http://www.vanthuong.com
 * Learn and share your java knowledge
 */
public class Student {
  private Long id;
  private String firstName;
  private String lastName;
  private Gender gender;
  private LocalDate dateOfBirth;

  public Student(Long id, String firstName, String lastName, Gender gender, LocalDate dateOfBirth) {
    this.id = id;
    this.firstName = firstName;
    this.lastName = lastName;
    this.gender = gender;
    this.dateOfBirth = dateOfBirth;
  }

  // Setters & Getters goes here

  @Override
  public String toString() {
    return "Student [" +
        "id=" + id +
        ", firstName='" + firstName + '\'' +
        ", lastName='" + lastName + '\'' +
        ", gender=" + gender +
        ", dateOfBirth=" + dateOfBirth +
        ']';
  }
}

com.vanthuong.example.FilterExample
package com.vanthuong.example;

import java.time.LocalDate;
import java.time.Month;
import java.time.Period;
import java.util.ArrayList;
import java.util.List;

public class FilterExample {

  public static void main(String[] args) {
    List<Student> students = initStudentList();

    // Loc va in ra man hinh cac sv co ho la Nguyen , sinh vao thang 01, nam 1992
    students.stream()
        .filter(student -> "Nguyen".equals(student.getLastName())
            && student.getDateOfBirth().getMonth().equals(Month.JANUARY)
            && student.getDateOfBirth().getYear() == 1992)
        .forEach(System.out::println);

    // Loc va in ra man hinh cac sv co ten bat dau la ky tu 'L', gioi tinh nu (FEMALE)
    System.out.println("======================");
    students.stream()
        .filter(student -> student.getFirstName().startsWith("L") && student.getGender().equals(Gender.FEMALE))
        .forEach(System.out::println);

    // Loc va in ra man hinh cac sinh vien co tuoi <= 25, gia su thoi diem hien tai la 2016-DECEMBER-20
    System.out.println("======================");
    students.stream()
        .filter(student -> {
          LocalDate currentLocalDate = LocalDate.of(2016, Month.DECEMBER, 20);
          LocalDate dateOfBirth = student.getDateOfBirth();
          Period period = Period.between(dateOfBirth, currentLocalDate);

          return period.getYears() >= 25;
        })
        .forEach(System.out::println);
  }

  private static List<student> initStudentList() {
    List<Student> students = new ArrayList<>();
    students.add(new Student(1L, "Long", "Nguyen", Gender.MALE, LocalDate.of(1992, Month.JANUARY, 20)));
    students.add(new Student(2L, "Phong", "Nguyen", Gender.MALE, LocalDate.of(1990, Month.AUGUST, 1)));
    students.add(new Student(3L, "Lan", "Do", Gender.FEMALE, LocalDate.of(1993, Month.OCTOBER, 10)));
    students.add(new Student(4L, "Ngoc", "Le", Gender.FEMALE, LocalDate.of(1992, Month.SEPTEMBER, 26)));
    students.add(new Student(5L, "Ngan", "Nguyen", Gender.FEMALE, LocalDate.of(1992, Month.JANUARY, 3)));
    return students;
  }
}

Trên đây là bài viết giới thiệu về phương thức filter của Stream API trong Java 8 và một số ví dụ. Hi vọng rằng nó sẽ giúp ích cho các bạn đọc giả khi tìm hiểu và sử các tính năng của Java 8. Chúc các bạn học tốt nhé!
Đăng bình luận

menu