Java 8 Stream (phần 1)

Chào mừng các bạn đã quay trở lại với thachleblog. Cũng đã “gác phím” khá lâu rồi, ăn chơi phè phỡn cũng đủ rồi, quay lại với công việc và học tập thôi, hehe. Bài viết đầu tiên trong năm 2017 hôm nay mình sẽ giới thiệu với các bạn ưu điểm của việc sử dụng Stream trong Java 8 so với sử dụng các method thông thường trong Collection. Vậy ưu điểm đó là gì, chúng ta cùng tìm hiểu nhé.

Java 8 Stream (phần 1)

 

Giới thiệu

Stream là một trong những tính năng được giới thiệu trong Java 8 cùng với Lambda expression. Stream được định nghĩa ngắn gọn bởi Oracle “Stream is a sequence of elements from a source that supporting sequential and parallel aggregate operations”. Chúng ta cùng phân tích nhé:

  • sequence of elements: đơn giản Stream về cấu trúc cũng gồm các phần tử (element) được sắp xếp theo trình tự như Collection. Tuy nhiên, Stream không thực sự lưu trữ các element mà chỉ  thao tác trên chúng.
  • from a source: các element cùng loại, source ở đây có thể là Collection, array, I/O resources..
  • aggregate operation: Stream hỗ trợ các phương thức (operation) tích hợp như SQL và các operation phổ biến của programing language.

Từ phân tích ở trên ta có thể thấy điểm khác biệt của Stream với Collection đó là Stream có hỗ trợ aggregate operation. Tuy nhiên, về bản chất Stream và Collection vẫn có điểm khác biệt cực kỳ quan trọng. Đó là:

  • Collection là một in – memory data structure, mỗi element của Collection đều được thao tác tính toán trước khi được add vào Collection. Sử dụng Collection interface, chúng ta sẽ phải sử dụng các thao tác lặp (for, foreach) để thao tác trên các element của Collection.
  • Stream là một conceptually fixed data structure, Stream sẽ “lo” cả phần thao tác với từng element và cả nơi lưu trữ kết quả, việc của chúng ta chỉ ra đưa ra “lệnh” và nhận kết quả. ^.^

Lợi ích của Stream

Như ở phần giới thiệu mình đã đề cập, mình sẽ phân tích các ưu điểm nổi trội của Stream so với sử dụng các Collection . Để chúng ta sẽ cân nhắc có nên sử dụng Stream hay tiếp tục sử dụng Collection như ở các phiên bản java cũ hay trường hợp nào nên dùng Stream, trường hợp nào sử dụng Collection.

Stream có 2 tính năng nổi trội so với Collection đó là:

  1. Stream hỗ trợ các aggregate operation.

Ví dụ đối với Collection thông thường, để tìm phần tử lớn nhất (max) hoặc nhỏ nhất (min) trong danh sách các phần tử ta phải sử dụng vòng lặp để duyệt tất cả các phần tử, so sánh…

Đối với Stream, việc tìm min, max… tương tự như với ngôn ngữ SQL ta chỉ việc mô tả “cái ta cần” (min, max) mà không cần quan tâm đến việc implement chi tiết như thế nào, ví dụ sql: SELECT id, MAX(value) from transactions. Bụp, ta có kết quả, có thể không cần quan tâm đến chi tiết bên dưới như thế nào.

  1. Stream hỗ trợ xử lý parallel, do đó sẽ tăng performance cho ứng dụng khi sử dụng Stream, xem khái niệm ở bài viết trước để hiểu thêm về parallel.

Bài viết cũng dài rồi, thôi phần 1 về Stream tạm dừng lại ở đây vậy. Ở phần 2, mình sẽ giới thiệu code demo một vài aggregate operation mà stream hỗ trợ. Hẹn gặp lại các bạn ở phần 2 nhé. Mọi ý kiến đóng góp vui lòng comment bên dưới. Mình sẽ follow up, xin cảm ơn. Happy sharing, happy learning 🙂

Tham khảo thêm:

http://www.oracle.com/technetwork/articles/java/ma14-java-se-8-streams-2177646.html