Không có gì khó khăn trong việc chuyển đổi các lớp phương thức đơn thành con trỏ hàm, nhưng bạn thiếu một điều: biểu thức lambda không chỉ là hàm, chúng là đóng. Sự khác biệt là đóng cửa có thể nắm bắt các biến bên ngoài. Xem xét ví dụ tiếp theo trong giả Java:
public Adder makeAdder(double startNumber) {
return #{ int number -> number + startNumber}
}
...
int startNumber = 5;
Adder add5 = makeAdder(startNumber);
add5.invoke(4); // ==> 9
Trong ví dụ này hàm lambda, được gọi bởi makeAdder(), là biến được xác định bên ngoài lambda này. Đó là lý do tại sao nó được gọi là "đóng cửa" - chúng được "đóng cửa" các biến miễn phí của chúng (trong trường hợp này - trên startNumber). Để xử lý các trường hợp đóng cửa như vậy phải giữ cả hai con trỏ đến một hàm và con trỏ đến môi trường của nó. Vì vậy, bạn nhận được một số cấu trúc dữ liệu có một phương thức và ít nhất một biến. Nhưng nó không phải là một định nghĩa của một đối tượng trong OOP? Vì vậy, lý do để tạo ra các loại đối tượng mới là gì nếu bạn có thể biến nó thành một thể hiện của lớp ẩn danh?
Tuy nhiên, một số tối ưu hóa khác về các lớp ẩn danh như vậy có thể được thực hiện. Tài liệu làm việc mà bạn đã đề cập đến đề cập đến một số trong số đó, ví dụ, suy ra và sử dụng các biến cuối cùng hiệu quả (mặc dù điều này được thực hiện chủ yếu để cho phép lambdas trên JVM trong chính, không tối ưu hóa mã). Lớp ẩn danh được sản xuất cũng có thể được thực hiện cuối cùng và hầu hết các JVM đã có tối ưu hóa tốt cho các loại và lớp cuối cùng.
Các cải tiến khác cũng có thể liên quan đến tham chiếu đến môi trường - có rất nhiều tùy chọn ở đó.
Khi bạn nói "con trỏ hàm", bạn có nghĩa là con trỏ đơn giản để bắt đầu mã chức năng không? – ffriend
@ffriend - Vâng, tôi có.Tôi biết có một số vấn đề với cách tiếp cận này, ví dụ nó có thể đồng bộ hóa trên một đối tượng. Nhưng JVM cũng có thể thực hiện một số tối ưu hóa không tầm thường khác, ví dụ như phác thảo các phương thức ảo. –