Лямбды - это способ предоставления реализации интерфейса, который имеет только один абстрактный метод (известный как functional interface
).
С учетом следующего объявления интерфейса
interface IntProcessor {
int process(int input1, int input2);
}
До Java 8. Было два способа использовать его. Один из них заключался в том, чтобы определить класс и реализовать его.
class MyIntProcessor implements IntProcessor {
public int process(int a, int b) {
return a*a + b*b;
}
}
Затем вы могли бы сделать это.
IntProcessor ip1 = new MyIntProcessor();
int n = ip1.process(4,5);
System.out.println(n); // prints 41
Другим способом было создание анонимного класса
IntProcessor ip2 = new IntProcessor() {
public int process(int a, int b) {
return a*a + b*b;
}
};
И снова.
n = ip2.process(4,5);
System.out.println(n); // prints 41
С лямбдами вы можете делать следующее:
IntProcessor ip3 = (a,b)-> a*a + b*b;
n = ip3.process(4,5);
System.out.println(n); // prints 41
(a,b)
являются аргументами и могут принимать любые значения. - Оператор
->
указывает лямбду, и правая часть будет использовать переменные аргумента и что-то с ними делать.
Тип возвращаемого значения из лямбда-выражения должен соответствовать типу возвращаемого значения Functional Interface
.
Компилятор позаботится о поиске соответствующего интерфейса и обеспечении соответствия аргументов их типам или сообщить об ошибке, если они этого не делают.