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/