лямбда с не конечной переменной - PullRequest
0 голосов
/ 15 декабря 2018

Я знаю, что внутри лямбды не может быть финальной / эффективной финальной переменной.Если это произойдет, возможно, вы работаете над устаревшей версией объекта.Я полагал, что компилятор не жаловался на этот код, где параметр функции может быть не окончательным:

Обновление сообщения с полным кодом:

public static void main(String[] args) {
    Object x=new Object();
    x=new Object();// I can reassign x as much as I can
    test(x);
}


  public static void test(Object x) {
// I can't reassign x here, shouldn't it disallow me to use function parameter ?
    List<String> list=new ArrayList<>();
    list.forEach(entry->System.out.println(entry+x)); // x here could be not final why the compiler didn't complain ?
}

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Ответ на ваш вопрос: потому что x в test является эффективно окончательным , потому что ничего в test не присваивается ему.

Обратите внимание, что x вtest и x в main не имеют никакого отношения друг к другу.В какой-то момент в main вы читаете значение main x и передаете это значение в test, но передается значение , а не какое-то соединение или ссылка насама переменная x.(Java является чисто языком передачи по значению .) Между двумя x с нет постоянной связи.Просто они оба содержат одно и то же значение (ссылка на объект).Тот факт, что вы можете присвоить main x, не имеет отношения к тому, можете ли вы присвоить test 'x.

0 голосов
/ 15 декабря 2018

Потому что это эффективно окончательно.Переменная или параметр, значение которых никогда не изменяется после инициализации, является окончательным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...