Chuyển đến nội dung chính
Mô-đun 7 · Bài học 1 trong tổng số 213/14 trong khóa học~12 min
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:

Java
@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:

Java
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(5, 3); // Returns 8

Cấu trúc của biểu thức Lambda

Cú pháp cơ bản của lambda là:

Code
(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ệnh return rõ ràng.
Java
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ại T và trả về một boolean (phương thức test(T t)).
  • Consumer<T>: chấp nhận đối số thuộc loại T và thực hiện một thao tác mà không trả về kết quả (phương thức accept(T t)).
  • Function<T, R>: chấp nhận một đối số T và trả về kết quả R (phương thức apply(T t)).
  • Supplier<T>: không chấp nhận đối số và trả về giá trị thuộc loại T (phương thức get()).

Hãy tự mình thử

tập thể dục#java.m7.l1.e1
Nỗ lực: 0Đang tải…

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ả.

Đang tải trình chỉnh sửa…
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ập thể dục#java.m7.l1.e2
Nỗ lực: 0Đang tải…

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”.

Đang tải trình chỉnh sửa…
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ử

tập thể dục#java.m7.l1.e3
Nỗ lực: 0Đang tải…

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).

Đang tải trình chỉnh sửa…
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ử