Лямбда в Java работает в сочетании с понятием functional interface.
Типичный пример: Function
. Function
- это функциональный интерфейс, функциональный метод которого apply
- это метод, который принимает один аргумент и возвращает результат.
Вы можете создать свой собственный функциональный интерфейс, который будет определять функциональный метод, принимающий 4 параметра и не имеющий типа возвращаемого значения, как это:
@FunctionalInterface
interface RectangleDrawer {
void draw(double x, double y, double w, double h);
}
(FunctionalInterface
аннотаций не является строго необходимыми, но это дает четкое намерение).
Затем вы можете создать лямбда, которая соответствует контракту этого функционального интерфейса. Типичный lambda syntax: (method arguments) -> (lambda body)
. В этом примере это будет: (x, y, w, h) -> gc.fillRect(x, y, w, h)
. Это компилируется, потому что лямбда объявляет 4 аргумента и не имеет типа возврата, поэтому его можно представить как функциональный метод RectangleDrawer
, определенный ранее.
Вы пример стал бы:
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);
}
В данном конкретном случае, можно использовать method reference создать лямбда, используя ::
оператора, что позволяет писать более простой код:
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);
}
Прочтите эту статью: http://stackoverflow.com/questions/13604703/how-do-i-define-a-method-which-takes-a-lambda-as-a-parameter-in-java-8 – PiotrSliwa