Trong hướng dẫn này, chúng ta sẽ tìm hiểu Stream là gì trong Java và cách chúng ta có thể tiếp cận nó. Mình sẽ so sánh Stream API với các câu lệnh SQL như một cách tiếp cận

Mình khuyên mọi người nên xem qua source của Stream Interface để hiểu rõ hơn vể một số hoạt động bên trong nó

Giới thiệu về Stream API

Stream đại diện cho một chuỗi các đối tượng từ một nguồn, hỗ trợ các hoạt động tổng hợp. Stream được sử dụng để thực hiện các hoạt động xử lý dữ liệu phức tạp như lọc, so sánh, ánh xạ,…

Chúng ta có thể hình dung Strean như một cách tiếp cận để xử lý dữ liệu theo cách tương tự như câu lệnh SQL.

Giả sử chúng ta có một bảng Sinh viên với các dữ liệu sau (quen thuộc quá :D)

ID Tên Họ Roll No Xếp loại Tổng điểm
1 Akshay Singh 1 V 900
2 Aman Pal 2 V 700
3 Bharat P 3 V 750
4 Piyush Chandra 4 V 990
5 Atul Kumar 5 V 1000

Và class cho bảng Sinh viên ở trên:

Example Student class

Bây giờ, chúng ta sẽ sử dụng Stream API để hình dung nó như 1 câu lệnh SQL

1. Stream<T> filter(Predicate<? super T> predicate);

Query: Tìm tất cả sinh viên từ bảng trên với tên bắt đầu bằng chữ ‘A’

List<Student> filteredList = studentList.stream()
    .filter((Student s)-> s.firstName.startsWith("A"))
    .collect(Collectors.toList());

2. long count();

Query: Đếm tổng số sinh viên trong bảng

long totalstudent= studentList.stream().count();

Query: Đếm tổng số sinh viên có tên bắt đầu bằng chữ ‘A’

long totalStudent= studentList.stream()
    .filter((Student s)->s.firstName.startsWith("A"))
    .count();

3. Stream<T> limit(long maxSize);

Query: Tìm 10 sinh viên đầu tiên trong bảng có tên bắt đầu bằng chữ ‘A’

List<Student> limitList= studentList.stream()
    .filter((Student s)->s.firstName.startsWith("A"))
    .limit(10)
    .collect(Collectors.toList());

4. Optional<T> min(Comparator<? super T> comparator);

Query: Tìm sinh viên có tổng điểm thấp nhất

Comparator<Student> mincomparator = Comparator.comparing(Student::getTotalmarks);
Student minMarks = studentList.stream()
    .min(mincomparator)
    .get();

5. Optional<T> max(Comparator<? super T> comparator);

Query: Tìm sinh viên có tổng điểm cao nhất

Comparator<Student> maxcomparator = Comparator.comparing(Student::getTotalmarks);
Student maxMarks = studentList.stream()
    .max(maxcomparator)
    .get();

6.Stream<T> sorted(Comparator<? super T> comparator);

Query: Sắp xếp sinh viên theo tổng điểm từ cao đến thấp

List<Student> sortedList = studentList.stream()
    .sorted(Comparator.comparingInt(Student::getTotalmarks).reversed())
    .collect(Collectors.toList());

7.Optional<T> findFirst();

Query: Tìm sinh viên đầu tiên trong bảng có tên bắt đầu bằng chữ ‘A’

Optional<Student> firstStudent=studentList.stream()
    .filter((Student s)->s.firstName.startsWith("A"))
    .findFirst();

Dưới đây là code đầy đủ của các Stream API đã nhắc đến ở trên

public class Student {

    private int studentId;
    private String firstName;
    private String lastName;
    private int rollNo;
    private String grade;
    private int totalmarks;

    public Student(int studentId,String firstName,String lastName,int rollNo,String grade,int totalmarks) {
        this.studentId=studentId;
        this.firstName=firstName;
        this.lastName=lastName;
        this.rollNo=rollNo;
        this.grade=grade;
        this.totalmarks=totalmarks;
    }

    public int getStudentId() {
        return studentId;
    }
    public void setStudentId(int studentId) {
        this.studentId = studentId;
    }

    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getRollNo() {
        return rollNo;
    }
    public void setRollNo(int rollNo) {
        this.rollNo = rollNo;
    }

    public String getGrade() {
        return grade;
    }
    public void setGrade(String grade) {
        this.grade = grade;
    }

    public int getTotalmarks() {
        return totalmarks;
    }
    public void setTotalmarks(int totalmarks) {
        this.totalmarks = totalmarks;
    }

    public static void main(String[] args) {
        List<Student> studentList=Arrays.asList(
                new Student(1, "Akshay", "Singh", 1, "V",900),
                new Student(2, "Aman", "Pal", 2, "V",700),
                new Student(3, "Bharat", "P", 3, "V",750),
                new Student(4, "Piyush", "Chandra", 4, "V",990),
                new Student(5, "Atul", "Kumar", 5, "V",1000));

        //Tìm tất cả sinh viên từ bảng trên với tên bắt đầu bằng chữ 'A'
        List<Student> filteredList= studentList.stream()
            .filter((Student s)->s.firstName.startsWith("A"))
            .collect(Collectors.toList());
            
        //Đếm tổng số sinh viên trong bảng
        long totalstudent= studentList.stream().count();

        //Đếm tổng số sinh viên có tên bắt đầu bằng chữ 'A' 
        long totalStudent= studentList.stream()
            .filter((Student s)->s.firstName.startsWith("A"))
            .count();
        
        //Tìm 10 sinh viên đầu tiên trong bảng có tên bắt đầu bằng chữ 'A'
        List<Student> limitList= studentList.stream()
            .filter((Student s)->s.firstName.startsWith("A"))
            .limit(10)
            .collect(Collectors.toList());

        //Tìm sinh viên có tổng điểm thấp nhất
        Comparator<Student> mincomparator = Comparator.comparing(Student::getTotalmarks);
        Student minMarks = studentList.stream()
            .min(mincomparator)
            .get();

        //Tìm sinh viên có tổng điểm cao nhất
        Comparator<Student> maxcomparator = Comparator.comparing(Student::getTotalmarks);
        Student maxMarks = studentList.stream()
            .max(maxcomparator)
            .get();

        //Sắp xếp sinh viên theo tổng điểm từ cao đến thấp
        List<Student> sortedList = studentList.stream()
            .sorted(Comparator.comparingInt(Student::getTotalmarks).reversed())
            .collect(Collectors.toList());

        //Tìm sinh viên đầu tiên trong bảng có tên bắt đầu bằng chữ 'A'
        Optional<Student> firstStudent = studentList.stream()
            .filter((Student s)->s.firstName.startsWith("A"))
            .findFirst();
    }
}

Nguồn: https://dzone.com/articles/java-streams-1

Bình luận