Biểu thức Lambda không thay đổi tập hợp các vấn đề bạn có thể giải quyết với Java nói chung, nhưng chắc chắn giúp giải quyết một số vấn đề dễ dàng hơn, chỉ vì lý do tương tự như chúng tôi không lập trình bằng hợp ngữ nữa. Loại bỏ các tác vụ thừa khỏi công việc của lập trình viên làm cho cuộc sống dễ dàng hơn và cho phép thực hiện những việc mà bạn thậm chí sẽ không đụng đến, chỉ với số lượng mã bạn sẽ phải tạo (thủ công).
Nhưng các biểu thức lambda không chỉ lưu các dòng mã. Biểu thức Lambda cho phép bạn xác định các hàm , một thứ gì đó mà bạn có thể sử dụng các lớp bên trong ẩn danh như một giải pháp thay thế trước đây, đó là lý do tại sao bạn có thể thay thế các lớp bên trong ẩn danh trong những trường hợp này, nhưng không phải nói chung.
Đáng chú ý nhất, các biểu thức lambda được định nghĩa độc lập với giao diện chức năng mà chúng sẽ được chuyển đổi sang, vì vậy không có thành viên kế thừa nào mà chúng có thể truy cập, hơn nữa, chúng không thể truy cập phiên bản của kiểu thực hiện giao diện chức năng. Trong một biểu thức lambda this
và super
có cùng ý nghĩa với ngữ cảnh xung quanh, hãy xem thêm câu trả lời này . Ngoài ra, bạn không thể tạo các biến cục bộ mới che khuất các biến cục bộ của ngữ cảnh xung quanh. Đối với nhiệm vụ dự định là xác định một hàm, điều này loại bỏ rất nhiều nguồn lỗi, nhưng nó cũng ngụ ý rằng đối với các trường hợp sử dụng khác, có thể có các lớp ẩn danh bên trong không thể chuyển đổi thành biểu thức lambda, ngay cả khi triển khai một giao diện chức năng.
Hơn nữa, cấu trúc new Type() { … }
đảm bảo tạo ra một thể hiện riêng biệt mới (như new
mọi khi). Các cá thể lớp bên trong ẩn danh luôn giữ một tham chiếu đến cá thể bên ngoài của chúng nếu được tạo trong một static
ngữ cảnh không phải . Ngược lại, biểu thức lambda chỉ nắm bắt một tham chiếu đến this
khi cần thiết, tức là nếu chúng truy cập this
hoặc không phải là static
thành viên. Và chúng tạo ra các trường hợp của danh tính không xác định có chủ ý, cho phép việc triển khai quyết định trong thời gian chạy có sử dụng lại các trường hợp hiện có hay không (xem thêm “ Biểu thức lambda có tạo một đối tượng trên heap mỗi khi nó được thực thi không? ”).
Những khác biệt này áp dụng cho ví dụ của bạn. Cấu trúc lớp bên trong ẩn danh của bạn sẽ luôn tạo ra một phiên bản mới, nó cũng có thể nắm bắt một tham chiếu đến phiên bản bên ngoài, trong khi của bạn (Developer o1, Developer o2) -> o1.getName().compareTo(o2.getName())
là một biểu thức lambda không bắt giữ sẽ đánh giá thành một singleton trong các triển khai điển hình. Hơn nữa, nó không tạo .class
tệp trên ổ cứng của bạn.
Tất nhiên, do sự khác biệt về cả ngữ nghĩa và hiệu suất, biểu thức lambda có thể thay đổi cách các lập trình viên giải quyết các vấn đề nhất định trong tương lai, cũng do các API mới bao gồm các ý tưởng về lập trình chức năng sử dụng các tính năng ngôn ngữ mới. Xem thêm biểu thức lambda Java 8 và các giá trị hạng nhất .
(o1, o2) -> o1.getName().compareTo(o2.getName())