Lambda trong Java hoạt động kết hợp với khái niệm functional interface.
Ví dụ điển hình là Function
. Function
là một giao diện chức năng có phương thức chức năng, apply
, là một phương thức lấy một đối số duy nhất và trả lại kết quả.
Bạn có thể tạo giao diện chức năng của riêng bạn, những người sẽ định nghĩa một phương pháp chức năng dùng 4 thông số và không có kiểu trả về, như thế này:
@FunctionalInterface
interface RectangleDrawer {
void draw(double x, double y, double w, double h);
}
(Các FunctionalInterface
chú thích là không thực sự cần thiết nhưng nó mang lại một rõ ràng ý định).
Sau đó, bạn có thể tạo một lambda tuân thủ hợp đồng của giao diện chức năng này. lambda syntax điển hình là (method arguments) -> (lambda body)
. Trong ví dụ này, nó sẽ là: (x, y, w, h) -> gc.fillRect(x, y, w, h)
. Điều này biên dịch bởi vì lambda tuyên bố 4 đối số và không có kiểu trả về, vì vậy nó có thể được biểu diễn như là phương thức chức năng của RectangleDrawer
được xác định trước đó.
Bạn ví dụ sẽ trở thành:
static GraphicsContext gc;
public static void main(String[] args) {
draw(0, 0, 50, 50, (x, y, w, h) -> gc.fillRect(x, y, w, h));
draw(0, 0, 50, 50, (x, y, w, h) -> gc.strokeRect(x, y, w, h));
}
static void draw(double x, double y, double w, double h, RectangleDrawer drawer) {
drawer.draw(x, y, w, h);
}
Trong trường hợp đặc biệt này, người ta có thể sử dụng một method reference để tạo ra các lambda, sử dụng ::
điều hành, cho phép viết mã đơn giản hơn:
static GraphicsContext gc;
public static void main(String[] args) {
draw(0, 0, 50, 50, gc::fillRect);
draw(0, 0, 50, 50, gc::strokeRect);
}
static void draw(double x, double y, double w, double h, RectangleDrawer drawer) {
drawer.draw(x, y, w, h);
}
Vui lòng đọc bài viết này: http://stackoverflow.com/questions/13604703/how-do-i-define-a-method-which-takes-a-lambda-as-a-parameter-in-java-8 – PiotrSliwa