Cách sử dụng biểu thức Lambda trong Java
Bạn có bao giờ nghĩ rằng một số phương thức có thể vừa trên một dòng, nếu không phải vì cú pháp Java冗长 mà bạn phải dùng để khai báo phương thức? Bạn không phải là người duy nhất.
Phương thức là một tính năng cực kỳ hữu ích trong lập trình.
Một phương thức là khối mã làm một việc cụ thể trong chương trình của bạn. Chúng được dùng vì một khi bạn định nghĩa phương thức, bạn có thể gọi nó nhiều lần. Điều này giúp giảm thiểu sự lặp lại trong mã, từ而让代码更易于维护。
Trong hướng dẫn này, chúng ta sẽ nói về biểu thức lambda trong Java. Đây là một loại phương thức đặc biệt mà bạn có thể dùng gọi là biểu thức lambda, thực thi một giao diện chức năng (functional interface). Chúng ta sẽ nói về cách chúng hoạt động và tại sao chúng được dùng.
Giao diện chức năng (Functional Interface) là gì?
Trước khi nói về biểu thức lambda, bạn cần hiểu giao diện chức năng. Đây là các giao diện chỉ chứa một phương thức trừu tượng (abstract method). Phương thức trừu tượng duy nhất trong giao diện chức năng nêu rõ mục đích của giao diện đó.
Xem ví dụ này:
interface CalculateThree { double multiply_by_three(String day); } Chúng ta đã tạo giao diện tên CalculateThree. Giao diện này chỉ có một phương thức, multiply_by_three, nghĩa là nó là một giao diện chức năng.
Biểu thức Lambda trong Java là gì?
Biểu thức lambda là một phương thức không tên. Nó được dùng để thực thi phương thức đã được định nghĩa trong giao diện chức năng. Biểu thức lambda đôi khi được gọi là phương thức vô danh vì chúng không có tên.
Biểu thức lambda sử dụng toán tử mũi tên (arrow operator), chia chúng thành hai phần:
(danh sách tham số) -> thân lambda
Bên trái chứa các tham số mà biểu thức dùng; bên phải chứa mã sẽ chạy khi biểu thức lambda được thực thi. Hàm lambda có thể chấp nhận một tham số hoặc nhiều tham số.
Cách sử dụng biểu thức Lambda
Hãy tạo chương trình nhận số do người dùng nhập và nhân nó cho ba. Chúng ta bắt đầu bằng mã chấp nhận số từ người dùng:
import java.util.Scanner; class Main { public static void main(String args[]) { Scanner user_input = new Scanner(System.in); System.out.println("Insert a number to multiply by three: "); double user_number = user_input.nextDouble(); } } Khi chạy mã này, người dùng sẽ được nhắc nhập số để nhân. Chương trình sẽ đọc số đó vào biến "user_number". Bạn có thể tìm hiểu thêm về cách lớp Scanner hoạt động bằng cách đọc hướng dẫn Java Scanner của chúng tôi.
Tiếp theo, chúng ta sẽ định nghĩa biểu thức lambda để nhân số cho ba. Dán mã sau phía trên phương thức main trong lớp:
interface CalculateThree { double multiply_by_three(double number); } Mã này định nghĩa giao diện mà biểu thức lambda của chúng ta sẽ tham chiếu. Sau đó thêm mã sau ở cuối phương thức main trong lớp:
CalculateThree multiply = (number) -> number * 3; double answer = multiply.multiply_by_three(user_number); System.out.println(user_number + " multiplied by three is " + answer);
Chúng ta đã dùng giao diện CalculateThree để khai báo biến "multiply". Điều này lưu mã cho biểu thức lambda của chúng ta. Biểu thức lambda liên kết với multiply_by_three trong giao diện CalculateThree vì multiply_by_three là hàm duy nhất trong giao diện.
Chúng ta đã dùng ký hiệu dấu chấm (dot notation) để gọi hàm này:
multiply.multiply_by_three(user_number);
Ký hiệu dấu chấm là nơi bạn chỉ định tên lớp hoặc giao diện bạn muốn tham chiếu, theo sau bởi dấu chấm, rồi tên phương thức bạn muốn truy cập. Trong trường hợp này, chúng ta muốn truy cập phương thức multiply_by_three bên trong giao diện "multiply".
Mã hoàn chỉnh của chúng ta trông như sau:
import java.util.Scanner; interface CalculateThree { double multiply_by_three(double number); } class Main { public static void main(String args[]) { Scanner user_input = new Scanner(System.in); System.out.println("Insert a number to multiply by three: "); double user_number = user_input.nextDouble(); CalculateThree multiply = (number) -> number * 3; double answer = multiply.multiply_by_three(user_number); System.out.println(user_number + " multiplied by three is " + answer); } } Hãy chạy mã và nhập số 3 để nhân:
Insert a number to multiply by three: 3 3.0 multiplied by three is 9.0
Mã của chúng ta đã nhân thành công số chúng ta nhập cho 3. Hành động này được thực hiện bằng biểu thức lambda chúng ta đã định nghĩa.
Cách sử dụng biểu thức Lambda khối (Block Lambda Expression)
Biểu thức lambda có thể xuất hiện dưới hai dạng: dùng biểu thức đơn hoặc dùng khối. Cú pháp lambda khối được dùng khi mã ở phía bên phải của mũi tên sẽ chiếm nhiều dòng.
Cú pháp khối là nơi bạn bao quanh mã ở phía bên phải của biểu thức lambda bằng ngoặc nhọn ({}).
Xem ví dụ này:
interface GreetUser { String welcome_user(String name); } class Main { public static void main(String args[]) { GreetUser send_greeting = (name) -> { System.out.println("Good morning!"); System.out.println("Welcome, " + name); }; System.out.println(send_greeting.welcome_user("Brad")); } } Chúng ta đã khai báo biểu thức lambda tên send_greeting. Biểu thức này tham chiếu đến giao diện GreetUser chúng ta định nghĩa ở đầu chương trình. Biểu thức lambda thực hiện hai hành động. Nó:
- In "Good morning!" ra console
- In "Welcome, ", theo sau là tên người dùng, ra console
Vì này chiếm hai dòng mã, chúng ta đã dùng cú pháp khối. Mã ở phía bên phải biểu thức lambda được bao quanh bởi ngoặc nhọn.
Kết luận
Biểu thức lambda là các phương thức không tên thực thi giao diện chức năng. Những hàm này đôi khi được gọi là lớp vô danh hoặc hàm vì chúng không có tên và không tự thực thi.
Bạn có sẵn sàng cho thử thách? Viết biểu thức lambda kiểm tra xem một số có chẵn hay không. Nếu chẵn, "X là số chẵn" nên được in ra console, với X là số được kiểm tra; ngược lại, "X là số lẻ" nên được in ra console.
Bây giờ bạn đã sẵn sàng để bắt đầu làm việc với biểu thức lambda trong Java như chuyên gia!