menu

VanThuong.Com

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

Java 8 - Tìm hiểu Streams API và các phương thức được hỗ trợ

Posted by on
Streams là một tính năng có thể nói là tuyệt vời nhất mà Java 8 mang lại các lập trình viên. Nếu như bạn chưa sử dụng qua nó bao giờ thì hãy cùng tôi tìm hiểu qua bài viết này nhé.
Java 8 - Tìm hiểu Streams và các phương thức được hỗ trợ
Trong Java 8, Stream là một lớp trừu tượng mới (abstract layer). Sử dụng Stream, bạn có thể xử lý dữ liệu trong với cách khai báo khá gần gũi với các câu lệnh của SQL. Bên cạnh đó nó khá giống với các Collection mà bạn thường sử dụng nhưng có vài điểm khác biệt. Các collections chủ yếu là các cấu trúc dữ liệu được sử dụng để tổ chức dữ liệu. Khi chúng ta cần xử lý dữ liệu trong các Collection này phải lấy dữ liệu từ nó ra và thực thi các phép toán logic trên chúng. Ví dụ như chúng ta có một danh sách các sinh viên. Để sắp xếp danh sách các sinh viên này theo thứ tự giảm dần của điểm Toán chẳng hạn, thì chúng ta phải thực thi những phép logic tương tự như sau.

Tạo Comparator
package com.vanthuong.tutorial;

import java.util.Comparator;

public class MathPointComparator implements Comparator<Student> {
  @Override
  public int compare(Student student1, Student student2) {
    if (student1.getMathPoint() > student2.getMathPoint()) {
      return -1;
    } else if (student1.getMathPoint() < student2.getMathPoint()) {
      return 1;
    } else {
      return 0;
    }
  }
}
Gọi comparator
Collections.sort(students, new MathPointComparator());

Bạn có cảm thấy rằng khi làm việc với Java 7 chúng ta phải tốn khá nhiều thời gian cho việc này không? Tuy nhiên, khi sử dụng Stream, bạn hoàn toàn có thể thực hiện dễ dàng hơn rất nhiều. Cùng xem ví dụ minh họa bên dưới đây.
students.stream()
    .sorted((student1, student2)->student1.getMathPoint().compareTo(student2.getMathPoint()))
    .collect(Collectors.toList());

Trong một trường hợp khác, khi chúng ta muốn lấy ra danh sách các sinh viên có giới tính là Nam chẳng hạn. Bằng cách thông thường bạn sẽ phải sử dụng vòng lặp for sau đó so sánh trường gender của các sinh viên này có bằng Nam hay không rồi đưa vào một danh sách mới. Nhưng khi sử dụng Stream, mọi việc sẽ được đơn giản hơn rất nhiều, bạn có thể xem qua ví dụ bên dưới đây:
List maleStudents = students
        .stream()
        .filter(student->student.getGender().equalsIgnoreCase("Nam"))
        .collect(Collectors.toList());

Với 2 ví dụ trên bạn có thể thấy rằng Stream giúp chúng ta viết code đơn giản, ngắn gọn và dễ hiểu hơn có phải không nào? Tiếp theo đây tôi sẽ viết tiếp về các phương thức mà Stream cung cấp cho chúng ta.

Một số phương thức của Stream

Trong Java 8, Collection interface được hỗ trợ 2 phương thức để tạo ra Stream bao gồm:
  • stream() - Trả về một stream sẽ được xử lý theo trình tự
  • parallelStream() - Trả về một Stream song song, các xử lý sau đó sẽ thực hiện song song.

Phương thức forEach()

Phương thức này cho phép chúng ta lặp qua mỗi phần tử có trong Stream, đầu vào của phương thức này là một Consumer. Chúng ta sẽ sử dụng phương thức này để thực hiện các phép toán trên các phần tử mà không trả về kết quả.
Ví dụ: lọc và in ra màn hình các sinh viên có giới tính Nữ
students
    .stream()
    .filter(student->student.getGender().equalsIgnoreCase("Nu"))
    .forEach(System.out::println);

Phương thức map()

Đầu vào của phương là một Function, nó sẽ map từng phần tử có trong Stream và trả về đối tượng theo kiểu của Function mà chúng ta truyền vào.
students.stream().map(Student::getMathPoint).forEach(System.out::println);
Đoạn code trên sẽ in ra danh sách điểm toán của các Sinh viên có trong danh sách.

Phương thức filter()

Như trong ví dụ trên tôi đã có minh họa, nó cho phép bạn truyền vào một Predicate và lọc ra các phần tử trong Stream thỏa với điều kiện của Predicate.
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
//get count of empty string
int count = strings.stream().filter(string -> string.isEmpty()).count();

Phương thức limit()

Được sử dụng để cắt giảm kích thước của Stream. Kết quả trả về các phần tử của Stream được lấy danh sách nhưng đã cắt giảm để không vượt quá maxSize (tham số đầu vào của phương thức).
List numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
numbers.stream().limit(5).forEach(System.out::println);
Đoạn code trên sẽ in ra màn hình dãy số từ 1 -> 5.

Phương thức sorted()

  • sorted() - Trả về một Stream mà các phần tử của Stream đã đươc sắp xếp theo một thứ tự tự nhiên.
  • sorted(Comparator<? super T> comparator) - Trả về một Stream mà các phần tử của Stream đã được sắp xếp theo tứ tự được định nghĩa bởi Comparator.
Xem lại ví dụ minh họa sắp xếp sinh viên theo điểm toán ở trên.

Trên đây là một số phương thức được sử dụng nhiều nhất với Stream trong Java 8. Nếu như bạn muốn tìm hiểu các phương thức khác để làm việc hiệu quả trên các Collection thông qua Stream có thể tham khảo trang chủ của Oracle.

Trên đây là bài viết giới thiệu về Stream trong Java 8 và một số phương thức phổ biến nhất để mọi người cùng tham khảo. Vì các phương thức được hỗ trợ có rất nhiều và trong khuôn khổ của bài viết tôi không tiện để liệt kê tất cả. Hi vọng trong thời gian sắp tới tôi sẽ đăng tải được thêm nhiều ví dụ về các phương thức của Stream để bạn đọc cùng theo dõi. Chúc các bạn học tốt nhé.
Đăng bình luận

menu