Bài học theo mô-đun (1/2)
Biểu thức Lambda
Bắt đầu từ Java 8, lập trình hàm được hỗ trợ thông qua Biểu thức Lambda. Biểu thức lambda về cơ bản là một phương thức ẩn danh (một hàm không có tên) có thể được truyền dưới dạng đối số cho các phương thức hoặc được lưu trữ trong các biến.
Giao diện chức năng
Biểu thức lambda chỉ có thể được sử dụng khi yêu cầu Giao diện chức năng. Giao diện chức năng là giao diện khai báo chính xác một phương thức trừu tượng. Java đánh dấu các giao diện này bằng chú thích @FunctionalInterface tùy chọn.
Ví dụ về giao diện chức năng do người dùng xác định:
@FunctionalInterface
interface MathOperation {
int operate(int a, int b);
}Trước Java 8, bạn sẽ phải định nghĩa một lớp bên trong ẩn danh. Với lambdas, cú pháp được đơn giản hóa thành:
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(5, 3); // Returns 8Cấu trúc của biểu thức Lambda
Cú pháp cơ bản của lambda là:
(parameters) -> { body }
- Không có tham số:
() -> System.out.println("Hello") - Tham số đơn:
x -> x * 2(có thể bỏ qua dấu ngoặc đơn) - Nhiều tham số:
(x, y) -> x + y - Nội dung nhiều dòng: nếu nội dung chứa nhiều câu lệnh thì bắt buộc phải có dấu ngoặc nhọn
{}và câu lệnhreturnrõ ràng.
MathOperation detailedAddition = (a, b) -> {
System.out.println("Adding...");
return a + b;
};Giao diện chức năng tiêu chuẩn trong Java
Gói java.util.function cung cấp một số giao diện chức năng tích hợp sẵn:
Predicate<T>: chấp nhận một đối số thuộc loạiTvà trả về một boolean (phương thứctest(T t)).Consumer<T>: chấp nhận đối số thuộc loạiTvà thực hiện một thao tác mà không trả về kết quả (phương thứcaccept(T t)).Function<T, R>: chấp nhận một đối sốTvà trả về kết quảR(phương thứcapply(T t)).Supplier<T>: không chấp nhận đối số và trả về giá trị thuộc loạiT(phương thứcget()).
Hãy tự mình thử
Hoàn thành mã bằng cách khởi tạo giao diện Máy tính bằng biểu thức lambda cộng hai số nguyên. Sau đó, gọi phương thức tính toán chuyển qua 5 và 3 rồi in kết quả.
Hiển thị gợi ý
Khai báo `Bộ cộng máy tính = (a, b) -> a + b;` và sau đó gọi `adder.calculator(5, 3)` bên trong lệnh gọi in.
Giải pháp khả dụng sau 3 lần thử
Tạo một phiên bản của giao diện chức năng tiêu chuẩn Predicate<String> có tên isLong bằng cách sử dụng biểu thức lambda để kiểm tra xem độ dài chuỗi có lớn hơn 5 ký tự hay không. Sau đó in kết quả kiểm tra “hello world”.
Hiển thị gợi ý
Lambda cho `Predicate<String>` nhận tham số `s` và trả về `s.length() > 5` làm điều kiện boolean.
Giải pháp khả dụng sau 3 lần thử
Sắp xếp danh sách tên chuỗi theo thứ tự bảng chữ cái bằng cách gọi phương thức sắp xếp() trên đó và chuyển biểu thức lambda triển khai Bộ so sánh (lấy hai chuỗi s1, s2 và so sánh chúng bằng cách sử dụng so sánhTo).
Hiển thị gợi ý
Sử dụng `names.sort((s1, s2) -> s1.compareTo(s2));` để sắp xếp danh sách tại chỗ.
Giải pháp khả dụng sau 3 lần thử