Я пишу все правила лямбда-выражения, но у меня есть сомнения по этому поводу.
Когда использовать лямбду
Лямда-выражение используется только для переопределения абстрактного метода функционального интерфейса. Не переопределять методы конкретных классов, абстрактных классов или не функциональных интерфейсов. Infact во всех этих случаях будет ошибка компилятора.
Тело лямбды: отношение между возвратом и {}
- Если я помещаю тело лямбды в фигурные скобки {} и абстрактный метод моего функционального интерфейса возвращает тип, я должен использовать return +;
Если я помещу тело лямбды в фигурные скобки {}, и абстрактный метод моего функционального интерфейса возвращает void, мне не нужно использовать return +;
Если я не помещу тело лямбды в фигурные скобки {}, я не могу использовать return +;
Infact, у меня есть:
interface MiaInterfaccia{
int assignment();
}
public class TestAssignmentOperator {
public static void main(String[] args) {
MiaInterfaccia m = () -> { int c = 0; }; //compilation error because, compiler adds 'the return;' so the return is void and not int
int c = 5;
MiaInterfaccia m = () -> c; //it is ok
}
}
Скобки {} обязательны, если:
Параметры лямбда
Параметры моего лямбда-выражения должны иметь имя, отличное от локальных переменных метода или блока, в котором находится моя лямбда-выражение.
Если у меня 0 или более одного параметра, скобки () обязательны.
Если у меня есть только один параметр, скобки () не обязательны
Необязательно объявлять тип параметров, если это просто.
Тело лямбды: переменные и 'this'
В теле моего лямбда-выражения я могу взять
локальные переменные, если они являются окончательными или фактически конечными;
переменные экземпляра, необязательно, они являются окончательными;
статические переменные, необязательно, они являются окончательными;
В теле моего лямбда-выражения я могу:
объявить 'this', если лямбда находится в методе экземпляра;
объявлять 'this', если лямбда-переменная является экземпляром.
Если лямбда находится в статическом методе, я не могу объявить 'this' в теле моего лямбда-выражения, иначе будет ошибка компиляции.
Это мой вопрос: я знаю, что в теле моего лямбда-выражения я могу объявлять переменные, и они могут быть конечными или нет. Но в моем коде у меня ошибка компилятора:
interface MiaInterfaccia{
int assignment();
}
public class TestAssignmentOperator {
public static void main(String[] args) {
MiaInterfaccia m = () -> int c = 0; //compilation error
}
}
Почему эта ошибка компилятора?
Большое спасибо!
A.