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

 

Java 8: Chi tiết về Lambda Expression

Chào mừng các bạn đã quay trở lại với thachleblog, như đã giới thiệu ở phần tiêu đề, bài viết hôm nay mình sẽ trình bày chi tiết về Java 8 Lambda Expression. Khái niệm Expression khá phổ biến ở các ngôn ngữ lập trình khác như C++, C#, JavaScript… Đối với Java thì đến phiên bản Java 8, feature này mới được thêm vào. Thông thường, khi một feature được thêm vào ở version mới, nó sẽ giúp giải quyết vấn đề nào đó ở các version cũ. Vậy Lambda Expression là gì và nó giải quyết vấn đề gì trong Java, chúng ta cùng tìm hiểu nhé.

java 8 lambda expression

Lambda Expression là gì?

Lambda Expression là một tính năng mà ta có thể sử dụng để định nghĩa một method mà không cần access modifier, name, return type… khái niệm này sẽ rất quen thuộc với các bạn biết ngôn ngữ JavaScipt (mình cũng biết chút xíu 😀 )

Cú pháp

parameter list (expression) -> {body}

Ví dụ

  1. (int a, int b) -> {  return a + b; }
  2. () -> System.out.println("Hello World");
  3. () -> { return 3.1415 };

Lambda Expression trong Java

Thông thường, để tạo một Thread trong Java ta làm như sau (các bạn cũng có thể xem lại các bài về multi thread của mình đã chia sẻ tại tại đây

  1.        Thread thread = new Thread(new Runnable() {
  2.               @Override
  3.               public void run() {
  4.                      System.out.println("I am a Thead");
  5.               }
  6.        });

Phân tích

Vì Java là một ngôn ngữ thuần hướng đối tượng, nên mọi thứ đều là đối tượng (object). Ở ví dụ trên, ta truyền parameter cho Thread(Runnable target) bằng cách new interface Runnable và override method run().

Ý tưởng của Lambda Expression rất đơn giản, thay vì sử dụng object làm parameter cho method thì ta sử dụng method như là một parameter. Quay lại ví dụ ở trên, ta có thể thay thế đoạn code trên bằng Lambda Expression:

  1.              Thread thread = new Thread(() ->
  2.                  System.out.println("I am a thread Lambda Expression!"));

Thêm ví dụ về Lambda Expression

Ví dụ implement interface Comparable

Sắp xếp danh sách học sinh ở ví dụ bài trước có thể thay thế bằng Lambda Expression như sau (class Student không cần impelement interface Comparable):

  1. Collections.sort(students, (Student student1, Student student1) -> student1.getName().compareTo(student1.getName()));

Ví dụ sử dụng List

  1. //Old way:
  2. List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
  3. for(Integer n: list) {       
  4. System.out.println(n);
  5. }

  1. //Lambda Expression
  2. List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7); list.forEach(n -> System.out.println(n));

Qua  các ví dụ trên, ta có thể thấy việc sử dụng Lamdpa Expression giúp thu gọn code đặc biệt trong việc implement các interface chỉ có duy nhất một method (functional interface) như Runnable và Comparable, code sẽ trở nên gọn, dễ đọc, dễ maintain và quan trọng là giúp tăng performance.

Việc Java thêm tính năng của functional programming language vào cho thấy khả năng flexible của ngôn ngữ Java (Java là ngôn ngữ thuần hướng đối tượng – object orented programming language). Dự là tương lai sẽ có thêm nhiều tính năng của functional programming vào Java, tha hồ mà tìm hiểu (đoán, hehe).

Còn rất nhiều tính năng được thêm vào ở phiên bản Java 8, mình sẽ tiếp tục chia sẻ ở các bài viết sau. Hẹn gặp lại các bạn. Chúc các bạn cuối tuần vui vẻ. Happy Learning

Tham khảo thêm
http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html
http://viralpatel.net/blogs/lambda-expressions-java-tutorial/