Mục lục
Java Lambda Expression (biểu thức Lambda) là một tính năng được thêm vào Java 8. Đây là một tính năng rất thú vị và nó đã góp phần thay đổi xu hướng lập trình trong Java. Đây có lẽ là một tính năng khá thú vị và còn khá mới lạ với các bạn mới. Từ hồi đi học mặc dù đã code java rất nhiều nhưng vẫn chưa có cơ hội được học và sử dụng lambda expression. Cho đến khi vào công ty thì được training ngay từ đầu luôn. Lambda expression giống như một chìa khóa để đi sâu vào các tính năng của java 8 mới cung cấp như Stream API, functional inteface etc.
Functional interface
Chỉ một chút khái niệm về functional interface để các bạn hiểu rõ hơn bài viết này. Functional Interface là một interface chứa duy nhất một abstract method. Một functional interface có thể có nhiều default method nên các bạn đừng nhầm tưởng rằng functional interface lại có nhiều method thế kia nhé, nó chỉ có một abstract method duy nhất thôi!
Annotation @FunctionalInterface đặt ở đầu interface cho chúng ta dễ dàng nhận biết nó là một functional interface. Điều quan trọng là annotation @FunctionalInterface sẽ đảm bảo cho interface của chúng ta chỉ có duy nhất một abstract method. Nếu chúng ta khai báo nhiều hơn một abstract method trong interface được đánh dấu @FunctionalInterface thì chúng ta sẽ nhận được lỗi ‘Unexpected @FunctionalInterface annotation’.
@FunctionalInterface public interface Runnable { /** * When an object implementing interface <code>Runnable</code> is used * to create a thread, starting the thread causes the object's * <code>run</code> method to be called in that separately executing * thread. * <p> * The general contract of the method <code>run</code> is that it may * take any action whatsoever. * * @see java.lang.Thread#run() */ public abstract void run(); }
Toán tử mũi tên (->)
Java 8 giới thiệu một toán tử mới là toán tử mũi tên ->. Toán tử này được dùng trong biểu thức Lambda với mục đích chia biểu thức Lambda thành 2 phần: tham số và nội dung thực thi
Ví dụ:
(int a, int b) -> { do something };
Các tính năng của lambda expression
Biểu thức lambda expression có thể dùng để triển khai một hàm ẩn danh (hàm không có tên, chỉ chứa tham số và mã code triển khai).
Trong java 8 lambda expression cùng với Functional interface là một bộ đôi được sử dụng rộng rãi về các tính năng ưu việt và tối giản code, giúp tăng tính đọc hiểu cho dự án.
Ngoài ra lambda expression cùng với Functional interface là một phần không thể xíu trong Stream api để triển khai các tính năng như sắp xếp, lọc, loop, map etc.
Cú pháp lambda expression
(argument-list) -> {body}
Biểu thức Lambda trong java gồm có 3 thành phần sau:
- Argument-list: danh sách tham số, có thể không có, có một hoặc nhiều tham số.
- Arrow-operator: toán tử mũi tiên được sử dụng để liên kết danh sách tham số và body của biểu thức.
- Body: Thân hàm, có thể trả về giá trị hoặc không.
Ví dụ 1: Sử dụng lambda với Collection
import java.util.ArrayList; class Test { public static void main(String args[]) { // Creating an ArrayList with elements // {1, 2, 3, 4} ArrayList<Integer> arrL = new ArrayList<Integer>(); arrL.add(1); arrL.add(2); arrL.add(3); arrL.add(4); // Using lambda expression to print all elements System.out.print("Show All: "); arrL.forEach(n -> System.out.print(n + " ")); System.out.println(); System.out.print("Show Filter: "); // Using lambda expression to print even elements // of arrL arrL.forEach(n -> { if (n % 2 == 0) System.out.print(n + " "); }); } }
Output
Show All: 1 2 3 4
Show Filter: 2 4
Ví dụ 2: Sử dụng lambda với Functional interface không chứa tham số.
@FunctionalInterface interface MyInterface { String sayHello(); } class LambdaExpression { public static void main(String[] args) { MyInterface s = () -> { return "Hello Lambda."; }; System.out.println(s.sayHello()); } }
Output: Hello Lambda.
Ví dụ 3: Sử dụng lambda với Functional interface chứa nhiều tham số
@FunctionalInterface interface MyInterface { String sayHello(String name, int age); } class LambdaExpression { public static void main(String[] args) { MyInterface s = (String n, int a) -> { return "Hello, your name is: " + n + " Age: " + a; }; String name = "Shareprogramming.net"; int age = 18; System.out.println(s.sayHello(name, age)); } }
Output: Hello, your name is: Shareprogramming.net Age: 18
Nguồn tham khảo
https://techtalk.vn/nam-ro-java-lambda-expression-cho-nguoi-moi-bat-dau.html