Biểu thức Lambda là một cách khác để viết một thể hiện của lớp ẩn danh, để tạo một thể hiện của lớp ẩn danh dễ viết hơn. Trong JVM, nó sẽ không chiếm nhiều bộ nhớ so với việc tạo đối tượng java bình thường với new
(thực thi các biến tĩnh, các khối tĩnh, nạp các lớp từ toàn bộ hệ thống phân cấp).
Lambda biểu hiện cú pháp:
(params) -> expression to implement a @FunctionalInterface
Trong trường hợp thử nghiệm của bạn: String s = (String) invoke(() -> true);
biểu thức có kiểu trả về true
không có đối số. Vì vậy, Runnable
FunctionalInterface
không khớp với biểu thức lambda vì nó có thuộc tính void run()
. Nó khớp với Callable
FuncationalInterface
sử dụng
V call()
.
Biểu thức lambda hoạt động như thế nào?
Nó có thể giống như các biểu thức lambda chỉ là cú pháp đường cho các lớp bên trong vô danh, nhưng có nhiều cách tiếp cận thanh lịch hơn. Giải thích đơn giản nhất là: biểu thức lambda được biểu diễn bằng một phương thức mới, và nó được gọi vào thời gian chạy bằng cách sử dụng tính năng động.
Source Code:
class LambdaExample {
public void abc() {
Runnable r =() -> {
System.out.println("hello");
}
r.run();
}
}
Bytecode tương đương:
class LambdaExample {
public void abc() {
Runnable r = <lambda$1 as Runnable instance>;
r.run();
}
static void lambda$1() {
System.out.println("hello");
}
}
Bên trong JVM, có một nhà máy lambda tạo ra một thể hiện của giao diện chức năng (ví dụ Runnable) từ tạo ra phương thức lambda (ví dụ lambda $ 1).
biểu thức Lambda là rất lớn, và thậm chí có công cụ tuyệt vời hơn trong Java 8...
Bắt điểm của bạn ở đây .. nhưng không hiểu phiên bản mã byte nhiều! – Ashu
Nó không phải là một cách khác để tạo ra một lớp vô danh. Nó giống như một sự thay thế cho các lớp ẩn danh trong các trường hợp cụ thể. – shmosel