Giới thiệu về Stream trong Java

Stream là một đối tượng mới của Java được giới thiệu từ phiên bản Java 8, giúp cho việc thao tác trên collection và array trở nên dễ dàng và tối ưu hơn. Vậy nó là gì? Trong bài viết này, chúng ta hãy cùng tìm hiểu về Stream trong Java các bạn nhé!

Đầu tiên, hãy cũng mình xem xét ví dụ sau:

Trong ví dụ này, mình có một List của đối tượng String. Từ đối tượng List này, mình chuyển nó qua đối tượng của Stream, sau đó dùng đối tượng Stream này để lọc lấy những String bắt đầu bằng ký tự “K”, cuối cùng là in những đối tượng String bắt đầu bằng chữ “K” ra màn hình.

Kết quả:

Giới thiệu về Stream trong Java

Rõ ràng, như các bạn thấy việc sử dụng Stream cùng với Lambda Expression làm cho việc code của chúng ta dễ hiểu và dễ đọc hơn rất nhiều.

Ở đoạn code trên, chúng ta lấy đối tượng Stream từ đối tượng Collection, các bạn sẽ có cảm giác có vẻ như Stream là một Collection phải không? Không phải vậy đâu các bạn, Stream không phải là một Collection.

Định nghĩa đơn giản thì Stream là một wrapper của collection và array. Nó wrap một collection sẵn có và các data source khác để hỗ trợ việc thao tác trên các collection, datasource đó sử dụng Lambda Expression. Vì thế, bạn chỉ cần chỉ định cái bạn muốn làm, còn việc làm như thế nào, Stream sẽ lo cái đó.

Các đặc điểm của Stream bao gồm:

  • Stream hỗ trợ hoàn hảo cho Lambda Expression.
  • Stream không chứa các element của collection hay array.
  • Stream là immutable object.
  • Stream không dùng lại được, nghĩa là một khi đã sử dụng nó xong, chúng ta không thể gọi nó lại để sử dụng lần nữa.
  • Chúng ta không thể dùng index để access các element trong Stream.
  • Stream hỗ trợ thao tác song song các element trong collection hay array.
  • Stream hỗ trợ thao tác lazy, khi cần thì thao tác mới được thực hiện. Để làm được điều này, hầu hết các thao tác với Stream đều return lại một Stream mới, giúp tạo một mắc xích bao gồm một loạt các thao tác nhằm thực thi các thao tác đó một cách tối ưu nhất. Mắc xích này còn được gọi là pipeline.

Có 3 công đoạn chính để tạo nên một pipeline cho Stream, đó là:

Tạo mới một Stream.

Interface Stream trong package java.util.stream là interface đại diện cho một Stream. Interface này chỉ làm việc với kiểu dữ liệu là object.

Với các kiểu primitive thì các bạn có thể sử dụng các đối tượng Stream dành cho những kiểu primitive đó, ví dụ như IntStream, LongStream hay DoubleStream.

Chúng ta có nhiều cách để tạo mới một Stream:

Tạo mới Stream từ một collection

Ví dụ như:

Tạo mới Stream từ các giá trị nào đó sử dụng interface Stream.

Ví dụ như:

Tạo mới Stream từ một array.

Ví dụ như:

Sử dụng 0 hoặc nhiều intermediate operations để chuyển đổi Stream ban đầu thành những Stream mới.

Stream có nhiều intermediate operations để thao tác với Stream, như ví dụ ở đầu bài viết mà mình đã sử dụng:

Hầu hết các intermediate operation đều return về một đối tượng Stream mới.

Điều quan trọng mà các bạn cần biết là: mặc dù chúng ta định nghĩa nhiều intermediate operation như thế nhưng chúng không thực thi các thao tác đó liền. Chỉ khi terminal operation được gọi thì toàn bộ các thao tác đó mới được thực thi nhé các bạn!

Sử dụng terminal operation lấy về kết quả hoặc một side-effect từ những intermediate operations đã định nghĩa.

Các bạn có thể dễ dàng xác định đâu là intermediate operation, đâu là terminal operation bởi vì terminal operation sẽ trả về void hoặc non-Stream object.

Sau khi terminal operation được gọi, Stream sẽ không sử dụng được nữa nhé các bạn. Muốn sử dụng lại thì các bạn phải tạo mới Stream từ những collection hay array mà các bạn muốn.

4.7/5 - (7 bình chọn)

5 thoughts on “Giới thiệu về Stream trong Java

  1. theo mình một đặc điểm thể hiện imutable là khi dùng collection.stream().filter() thì nó sẽ return stream mới , ko modify stream ban đầu

    1. em nghĩ nó là không thể thay đổi object truyền vào, nghĩa là nó không thể thay đổi mảng hay collection truyền vào :))” chắc bây h a đã ở tầm khác r nhưng e xin phép xin ít hành ạ :))”

  2. anh oi, em vẫn mơ hồ phan stream này, tai sao lại chuyển array, collection qua stream rồi mới xử lý, mình xử lý trực tiếp trên array or list đó vẫn dc mà anh,

    1. Em vẫn có thể thao tác trực tiếp trên array hoặc list nhưng việc sử dụng Stream sẽ hữu ích hơn nhiều. Thay vì trước đây em phải muốn thao tác với các phần tử trong array hoặc list, em phải đọc hết tất cả các phần tử đó lên rồi tuỳ theo nhu cầu để thao tác. Sử dụng Stream em không cần phải quan tâm cách làm là gì, chỉ cần chỉ định nhu cầu của mình và sử dụng phương thức thích hợp thì Stream sẽ tự làm cho em.
      Việc sử dụng Stream với Lambda Expression sẽ giúp em giảm code đi rất nhiều. 😀 Em sử dụng nhiều sẽ thấy lợi ích của nó nhé!

Add Comment