создание переменных в теле лямбды - PullRequest
1 голос
/ 16 апреля 2019

Я пишу все правила лямбда-выражения, но у меня есть сомнения по этому поводу.

Когда использовать лямбду

Лямда-выражение используется только для переопределения абстрактного метода функционального интерфейса. Не переопределять методы конкретных классов, абстрактных классов или не функциональных интерфейсов. 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.

Ответы [ 3 ]

1 голос
/ 16 апреля 2019

Почему эта ошибка компилятора?

Поскольку разработчики языка Java по праву решили, что предлагаемый синтаксис не имеет значения. Мы уже знаем тип возвращаемого значения; мы можем видеть это из MiaInterfaccia. Это int.

Какое использование предоставляет идентификатор c? Он недоступен в любой области видимости, поэтому на него нельзя ссылаться.

Лямбды были добавлены к уменьшению многословия анонимных внутренних классов. int c = только добавляет ненужные подробности.

Правильный способ написать это

MiaInterfaccia m = () -> 0;

Если вы предпочитаете думать о нем как о компиляторе, добавляющем неявные возвраты (лично я не нахожу это полезным, но вы, кажется, находите это убедительным), то следующее также не подходит для Java.

int foo()
{
    return int c = 0;
}
1 голос
/ 16 апреля 2019

Как уже упоминалось @Naya, я просто хочу добавить, что если вы не хотите использовать фигурные скобки, то Единственное возможное утверждение - это единица, и это должно быть возвращаемое значение,

Но здесь,

int c = 0; 

ничего не возвращает, Если вы хотите попробовать с логическим значением, вы получите лучшее представление о том, как будет возвращаться значение, когда у вас есть одно утверждение,

Boolean assignment();

MiaInterfaccia m = () ->  true == false;
MiaInterfaccia m = () ->  true;
MiaInterfaccia m = () ->  false;
MiaInterfaccia m = () ->  true != false;
1 голос
/ 16 апреля 2019

Ошибка в том, что ваша лямбда () -> int c = 0; имеет тип void.Если вы не хотите использовать, верните эту локальную переменную, которая просто заменит ее на

 MiaInterfaccia m = () -> {
     int c = 0; 
     return c;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...