Java Development Kit 7 (JDK 7) là phiên bản chính tiếp theo của nền tảng Java SE, dự kiến sẽ được phát hành trong năm 2010 (hiện đã có bản preview). Phiên bản này giới thiệu nhiều tính năng mới quan trọng trong việc tăng hiệu năng, tính khả dụng và bảo mật của nền tảng Java. Một trong những cập nhật về ngôn ngữ trong phiên bản này là các biểu thức Lambda.
Về ý nghĩa, biểu thức Lambda trong Java cũng có cùng ý nghĩa như trong .NET 3.5 (xem tại https://namdh.wordpress.com/2009/07/22/lambda-expression/). Bài viết này sẽ hướng dẫn cách dùng biểu thức Lambda có trong bản JDK 7. Nội dung được tham khảo từ http://mail.openjdk.java.net/pipermail/lambda-dev/attachments/20100122/3764c21a/attachment.txt, đây là tài liệu thiết kế và đặc tả biểu thức Lambda, tuy nhiên vì vẫn chưa phải bản chính thức nên có thể sẽ có sự khác nhau trong tài liệu này và phiên bản cuối cùng.
Cách viết
Biểu thức Lambda được bắt đầu bằng ký hiệu #, theo sau bởi (danh sách tham số), và thân biểu thức ().
Ví dụ:
#()()
#()(5)
#()(x.m())
#()((foo++))
#()(“a”+”b”)
#(int x)()
#(int x)(x * x)
Trong đó danh sách tham số có thể rỗng, một hoặc nhiều tham số, thân biểu thức có thể có hai dạng, hoặc là một biểu thức đơn, như
#(int x, int y) (x * y), hay một khối lệnh #(int x, int y) (if (x > y) return x; else return y;).
Kiểu trả về của biểu thức lambda có dạng #T(t1, t2, …, tn), ví dụ, trong đó T là kiểu trả về của thân biểu thức, t1, t2,…, tn là kiểu của các tham số.
Kiểu trả về của một biểu thức lambda phụ thuộc vào thân biểu thức, trong trường hợp một biểu thức đơn, kiểu trả về cũng là kiểu của biểu thức đơn đó. Trường hợp thân là một khối lệnh, kiểu trả về sẽ phụ thuộc vào các câu lệnh return bên trong đó, ở đây có một số quy tắc:
– Các câu lệnh return hoặc tất cả phải trả về giá trị, hoặc tất cả đều không trả giá trị, ví dụ trong trường hợp sau là không hợp lệ: #(int x, int y) (if (x > y) return x; else return;).
– Nếu không có câu lệnh return nào, hoặc tất cả đều không trả về giá trị, kiểu của biểu thức Lambda sẽ là void.
– Kiểu trả về được xác định dựa trên các câu lệnh return mà không phụ thuộc vào việc câu lệnh đó có khả năng được thực thi hay không (unreachable), như trường hợp sau thì kiểu trả về vẫn được xác định là int: #() (if (1 > 2) return 10; throw new Error();).
Một số ví dụ về kiểu trả về:
#()() kiểu trả về là #void()
#()(5) kiểu trả về là #int(void)
#()(“a”+”b”) kiểu trả về là #String(void)
#(int x)() kiểu trả về là #void(int)
#(int x)(x * x) kiểu trả về là #int(int)
#(int x, int y) (x * y) kiểu trả về là #int(int, int)
#(int x, int y) (if (x > y) return x; else return y;) kiểu trả về là #int(int, int)
Kiểu trả về này ở dạng function type (kiểu như con trỏ hàm trong C), để gọi ta có thể dùng ký hiệu !:
#()(42)!() // Trả về giá trị = 42.
#int() fortyTwo = #()(42);
n = fortyTwo!(); // n giờ bằng 42
#int(int) doubler = #(int x)(x + x);
n =doubler!(fortyTwo!()); // n = 84
Cũng như trong .NET, sử dụng biểu thức lambda trong Java sẽ giúp viết các câu lệnh gọn gàng hơn, và sẽ hiệu quả hơn khi kết hợp với một loạt các tính năng mới khác có trong JDK7.