Java những điều có thể bạn đã biết: Có gì mới trong Java 8 (Phần 2)

Đây là bài tiếp nối vơi bài Java những điều có thể bạn đã biết: Có gì mới trong Java 8 (Phần 1), Trong bài này chúng ta sẽ tiếp tục tìm hiểu tiếp về Mapping cũng như Reducing thông qua Stream API.

Mapping

Stream API cung cấp method map(), flatMap() thể thực hiện việc bước mapping, method này trả về một stream, vì thế nó chính là một intermediary operation.

Ngoài ra cũng như forEach() sử dụng Consumer hay filter() sử dụng Predicate, map() hay flatMap() sử dụng một thứ gọi là Function để quy định việc mapping, và Function cũng là một Functional Inteface.

Cách sử dụng đơn giản thôi.

Phía trên chính là cách sử dụng cơ bản của hàm map(). Method map() sẽ nhận vào một Function, Function đó sẽ gọi từng phần tử trong của input stream để xử lý trả về kết quả, và đưa nó vào trong output stream.

Còn đối với hàm flatMap(), sẽ trả về một stream mà trong stream đó chứa các phần tử là tất cả các phần tử của mapped stream trước đó dựa trên mapping function. Đại loại kết của trả về của flatMap là Stream<Stream<R>>, một stream của các stream và thay vì việc đó thì gom hết vào một stream cho tiện.

Mỗi mapped stream sau khi được xử lý để đưa vào output stream thì sẽ được đóng lại. Đoạn này hơi khó hiểu nhưng cụ thể cách dùng như sau.

Reduction

Có hai loại reduction trong Stream API là Aggregation và Collection.

1 – Aggregation

Aggregation bao gồm các phép toán như sum, max, min, blabla…

Tham số thứ nhất là identity element để xác định gía trị gốc của kết quả trả về, tham số thứ hai là reduce operation, một reduce operation là một BinaryOperator<T>, BinaryOperator là một Java Interface tương tự như Consumer, Predicate hay Function.

 Như vậy sẽ đặt ra các câu hỏi như:

  • Làm thế nào nếu reduce một empty stream bằng aggregation? Câu trả lời là kết quả của việc reduce một empty stream sẽ là identity element.
  • Làm thế nào nếu reduce một stream chỉ có một phần tử? Dễ hiểu kết quả của việc reduce sẽ chính là element đó.

Ví dụ.

Ngoài ra, có một số trường hợp khác như sử dụng tìm max trong stream như sau.

Như các bạn có thể thấy tôi dùng Optional<Integer>,  khi tôi dùng Optional, có nghĩa là kết quả trả về có thể có hoặc không, bởi vì giả sử nếu stream empty chúng ta sẽ không biết được đâu là max. Tóm lại chúng ta dùng Optional khi chúng ta không biết được kết quả trả về sẽ là gì. Cách sử dụng Optional như sau.

Hoặc chúng ta có thể sử dụng bằng cách.

Khi đó chúng ta sẽ có kết quả trả về là giá trị trong optional nếu tồn tại, nếu không nó sẽ trả về giá trị mặc định là giá trị mà chúng ta đã truyền vào hàm orElse(). Hoặc throw exception được chỉ định trước thông qua việc sử dụng orElseThrow().

Ngoài ra chúng ta còn có các reduction operator như min(), count(), allMatch(), noneMatch(), anyMatch(), findFirst(), findAny(), blabla… các bạn có thể xem thêm trong Javadoc.

Tất cả các reduction operator đều là terminal operator, có nghĩa là khi call reduction quá trình xử lý dữ liệu trong stream sẽ được thực hiện. Cụ thể.

2 – Collection

Collection hay còn gọi là mutable reduction, là việc gom hết tất cả các phần tử trả về từ stream sau khi mapping, filtering vào một container.

Ví dụ.

Tôi nghĩ những ví dụ trên khá dễ hiểu về cách hoạt động của Collector rồi. Ngoài ra khi collect các bạn có thể thực hiện reduce ngay trong downstream, ví dụ như sau.

Tổng kết

Stream là một đối tượng có thể giúp cho ta xử lý data một cách hiệu quả và dễ dàng, cũng như không giới hạn lượng data đưa vào stream.

Có ba loại hoạt động chính khi sử dụng stream là filtering/mapping/reduction.

Lưu ý khi sử dụng stream, đó là stream không thể reuse, một khi stream đã được xử lý thì sẽ không dùng chính stream đó để xử lý cho việc khác được nữa.

Hy vọng qua hai bài viết ngẳn ngủi này, các bạn đã hiểu được phần nào về Stream và cách xử lý dữ liệu thông qua Stream API để có thể áp dụng vào những trường hợp cụ thể.

Chào thân ái, và hẹn gặp lại trong những bài viết tiếp theo.

Advertisements

2 thoughts on “Java những điều có thể bạn đã biết: Có gì mới trong Java 8 (Phần 2)

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s