Các tham chiếu phương thức có bỏ qua phần trên của trình bao bọc lambda không? Họ có thể trong tương lai?
Theo Hướng dẫn Java về Tài liệu tham khảo phương pháp :
Đôi khi ... một biểu thức lambda không làm gì ngoài việc gọi một phương thức hiện có. Trong những trường hợp đó, thường rõ ràng hơn khi đề cập đến phương thức hiện có theo tên. Tài liệu tham khảo phương pháp cho phép bạn làm điều này; chúng là các biểu thức lambda nhỏ gọn, dễ đọc cho các phương thức đã có tên.
Tôi thích cú pháp lambda hơn cú pháp tham chiếu phương thức vì nhiều lý do:
Lambdas rõ ràng hơn
Bất chấp tuyên bố của Oracle, tôi thấy cú pháp lambda dễ đọc hơn so với cú pháp tham chiếu phương thức đối tượng vì cú pháp tham chiếu phương thức không rõ ràng:
Bar::foo
Bạn có đang gọi một phương thức một đối số tĩnh trên lớp của x và truyền nó x không?
x -> Bar.foo(x)
Hoặc bạn đang gọi một phương thức đối số zero trên x?
x -> x.foo()
Cú pháp tham chiếu phương thức có thể thay thế cho một trong hai. Nó ẩn những gì mã của bạn đang thực sự làm.
Lambdas an toàn hơn
Nếu bạn tham chiếu Bar :: foo như một phương thức lớp và Bar sau đó thêm một phương thức cá thể có cùng tên (hoặc ngược lại), mã của bạn sẽ không còn được biên dịch nữa.
Bạn có thể sử dụng lambdas một cách nhất quán
Bạn có thể gói bất kỳ chức năng nào trong lambda - vì vậy bạn có thể sử dụng cùng một cú pháp một cách nhất quán ở mọi nơi. Cú pháp tham chiếu phương thức sẽ không hoạt động trên các phương thức lấy hoặc trả về mảng nguyên thủy, ném ngoại lệ được kiểm tra hoặc có cùng tên phương thức được sử dụng làm thể hiện và phương thức tĩnh (vì cú pháp tham chiếu phương thức không rõ ràng về phương thức nào sẽ được gọi) . Chúng không hoạt động khi bạn có các phương thức quá tải với cùng số lượng đối số, nhưng dù sao bạn cũng không nên làm điều đó (xem mục 41 của Josh Bloch) vì vậy chúng tôi không thể chống lại các tham chiếu phương thức.
Phần kết luận
Nếu không có hình phạt về hiệu năng khi làm như vậy, tôi muốn tắt cảnh báo trong IDE của mình và sử dụng cú pháp lambda một cách nhất quán mà không rắc tham chiếu phương thức không thường xuyên vào mã của tôi.
PS
Không có ở đây cũng không có, nhưng trong giấc mơ của tôi, các tham chiếu phương thức đối tượng trông giống như thế này và áp dụng invoke-Dynamic đối với phương thức trực tiếp trên đối tượng mà không có trình bao bọc lambda:
_.foo()
.map(_.acceptValue())
: Nếu tôi không nhầm, nó trông rất giống cú pháp Scala. Có lẽ bạn chỉ đang cố sử dụng ngôn ngữ sai.
System.out::println
đến forEach()
tất cả các thời gian ...?