🏞️

「Java 8」Hướng dẫn Stream API

Created
Oct 28, 2021 8:31 AM
Tags
javamiddle
Chapter

Giới thiệu

Stream là một trong những concept được coi là đem sự thay đổi lớn nhất trong Java 8. Để có thể hiểu được nội dung này trọn vẹn, mình đề nghị các bạn đọc trước các khái niệm sau:

Khái quát

Stream là một abtract layer cho phép bạn xử lý một dòng dữ liệu dựa trên các thao tác đã định nghĩa trước.

Bạn có thể tạo Stream từ các nguồn dữ liệu như CollectionsArrays hoặc I/O resources.

Mặc định các lớp kế thừa của Collection đều có hàm .stream():

Cách sử dụng

Chức năng của Stream là cực kì đa dạng giúp bạn thao tác dữ liệu dễ dàng hơn.

forEach

Duyệt qua toàn bộ dữ liệu của bạn

map

Tạo ra các giá trị mới từ dữ liệu hiện có

filter

filter() gíup chúng ta thao tác với những dữ liệu mong muốn

limit

Giới hạn số lượng dữ liệu cần xử lý

sorted

sắp xếp Stream

Bạn có thể tự định nghĩa cách sort bằng cách thêm Comparator vào

collect

collect giúp chúng ta lấy toàn bộ dữ liệu đã biến đổi trong Stream thành đối tượng mình mong muốn

Xử lý song song

Bản chất của Stream

Bạn hãy chạy chương trình này nhé

Kết quả:

Bạn sẽ thấy rằng chương trình chỉ xử lý dữ liệu vừa đủ thoả mãn điều kiện limit(3) mà thôi, còn lại nó sẽ bỏ qua để tối ưu hoá performance.

Chứng tỏ Stream là Lazy evaluation. Hiểu đơn giản là nó sẽ không xử lý dữ liệu trực tiếp qua từng bước, mà chờ bạn khai báo xong tất cả các thao tác operation như mapfilter,v.v.. cho tới khi gặp lệnh .collect() thì nó thực hiện toàn bộ trong một vòng lặp duy nhất.

Hàm .collect() và một số hàm như min()max()count() được gọi là terminal operation. Khi gọi những function có dạng terminal thì Stream mới chính thức hoạt động.

Một lưu ý khi sử dụng là Stream không được tái sử dụng. Ví dụ:

Vì Stream được tạo ra để xử lý dữ liệu chứ không phải để lưu trữ!

Nên muốn sử dụng, mỗi lần bạn sẽ cần tạo ra 1 Stream mới.

Lời kết

Tới đây là bạn đã có thể sử dụng Stream để giúp code của mình bá đạo hơn bao giờ hết rồi đấy!

Chúc bạn thành công, và chớ quên chia sẻ cho bạn bè nhé, ohoho :3