Lambda Expression được giới thiệu từ phiên bản Java 8 để enable functional programming cho Java, giúp giảm thiểu tối đa các mã nguồn không cần thiết. Vậy Lambda Expression là gì? Trong bài viết này, mình sẽ giới thiệu với các bạn những kiến thức cơ bản của Lambda Expression các bạn nhé!
Tại sao lại cần Lambda Expression?
Để trả lời cho câu hỏi này, mình xin đưa ra một ví dụ như sau.
Giả sử bây giờ mình có một interface, tên là SayHello với nội dung như sau:
1 2 3 4 5 |
package com.huongdanjava; public interface SayHello { void say(); } |
Giờ mình muốn sử dụng interface trên để hiện thực một đối tượng có thể in dòng chữ “Hello” trong ứng dụng của mình. Ở những phiên bản Java 7 trở về trước, mình có thể sử dụng 2 cách sau:
- Cách thứ nhất là mình sẽ tạo mới một class hiện thực interface SayHello.
1 2 3 4 5 6 7 8 9 10 |
package com.huongdanjava; public class SayHelloImpl implements SayHello { @Override public void say() { System.out.println("Hello"); } } |
và sử dụng nó trong ứng dụng của mình:
1 2 3 4 5 6 7 8 9 |
package com.huongdanjava; public class Example { public static void main(String[] args) { SayHello sh = new SayHelloImpl(); sh.say(); } } |
- Cách thứ hai là mình sẽ định nghĩa một anonymous class ngay trong phương thức main của ứng dụng của mình.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package com.huongdanjava; public class Example { public static void main(String[] args) { SayHello sh = new SayHello() { @Override public void say() { System.out.println("Hello"); } }; sh.say(); } } |
Các bạn có thấy là đối với cả 2 cách trên, có quá nhiều code cần phải hiện thực không? Cách thứ nhất thì phải tạo một class mới để hiện thực interface SayHello, còn cách thứ hai thì phải implement phương thức say() ngay trong phương thức main của class Example. Trong khi đó, nhu cầu của chúng ta chỉ là in ra dòng chữ “Hello”, hay nói cách khác chúng ta chỉ cần đoạn code sau:
1 |
System.out.println("Hello"); |
Để giải quyết vấn đề này, từ Java 8, Lambda Expression đã được giới thiệu. Với Lambda Expression, code chúng ta sẽ đơn giản như sau:
1 2 3 4 5 6 7 8 9 |
package com.huongdanjava; public class Example { public static void main(String[] args) { SayHello sh = () -> System.out.println("Hello"); sh.say(); } } |
Kết quả:
Ở đây, () -> System.out.println(“Hello”), chính là một Lambda Expression đấy các bạn.
Cách sử dụng Lambda Expression
Biểu thức Lambda Expression là một anonymous function bao gồm có 2 phần chính:
- Phần đầu tiên nằm trước dấu “->” để khai báo các tham số. Các tham số này nằm giữa hai dấu “(” và “)” và mỗi tham số cách nhau bằng dấu phẩy. Trong trường hợp chúng ta chỉ có một tham số thì có thể bỏ 2 dấu “(” và “)” cũng được.
- Phần thứ hai sau dấu “->’ sẽ là block code thực thi. Block code này sẽ nằm giữa hai dấu “{” và “}”. Trong trường hợp block code của chúng ta chỉ có một dòng thì các bạn có thể bỏ 2 dấu “{“, “}” và nếu có return statement thì bỏ nó luôn cũng được.
Lambda Expression được sử dụng với một interface mà interface đó, gọi là Functional Interface, chỉ có một phương thức abstract duy nhất. Phương thức này có thể không có tham số hoặc nhiều tham số.
Ở ví dụ trên là cách sử dụng với interface có phương thức không có tham số.
Đối với interface có phương thức có một hoặc nhiều tham số ví dụ như:
1 2 3 4 5 |
package com.huongdanjava; public interface SayHello { void say(String name); } |
thì chúng ta có thể khai báo Lambda Expression như sau:
1 2 3 4 5 6 7 8 9 |
package com.huongdanjava; public class Example { public static void main(String[] args) { SayHello sh = (name) -> System.out.println("Hello, " + name); sh.say("Khanh"); } } |
Kết quả:
Khanh Phạm
interface nếu có 2 abstract methods trở lên sẽ bị lỗi. để an toàn nhất, bạn thêm annotation
@FunctionalInterface
vào trước phần khai báo interface là được.Trương Định
Hay lắm anh, cảm ơn anh nhiều nhé.
Ngọc Khương
Cảm ơn anh. Bài viết hay lắm ạ.
Anh có nói đến Lambda Expression chỉ dùng khi interface chỉ có một phương thức abstract. Vậy nếu interface đó có nhiều phương thức thì mình không thể xử lý theo cách này phải không ạ
Khanh Nguyen
Khi một interface có nhiều phương thức abstract thì nó sẽ không còn được gọi là Functional Interface nữa.
Anh sẽ có thêm một bài viết về Functional Interface, em theo dõi Hướng Dẫn Java để cập nhập nhé!