Использование лямбда-выражения внутри al oop вызывает ошибку, как мне решить эту проблему? - PullRequest
0 голосов
/ 26 мая 2020
    while(flag==false){
        loc=Collections.min(sticks);
        result[k++]=sticks.size();
        sticks.removeIf(f -> (f==loc));
        sticks.replaceAll(g ->(g-loc));        
    }

Решение. java: 24: ошибка: локальные переменные, на которые ссылается лямбда-выражение, должны быть окончательными или фактически окончательными

             sticks.removeIf(f -> (f==loc));

Решение. java: 25: ошибка: локальные переменные ссылка на лямбда-выражение должно быть final или фактически final

            sticks.replaceAll(g ->(g-loc));        

1 Ответ

2 голосов
/ 26 мая 2020

Вы должны убедиться, что переменная lo c никогда не изменится после объявления.

Это будет работать:

  while(flag==false){
    int loc=Collections.min(sticks);
    result[k++]=sticks.size();
    sticks.removeIf(f -> (f==loc));
    sticks.replaceAll(g ->(g-loc));        
  }

Это не будет:

  int loc = -1;
  while(flag==false){
    loc=Collections.min(sticks);
    result[k++]=sticks.size();
    sticks.removeIf(f -> (f==loc));
    sticks.replaceAll(g ->(g-loc));        
  }

Компилятор не знает, когда будет выполнена лямбда, поэтому он должен знать во время компиляции, как разрешить все переменные.

В первом случае lo c переменная назначается только один раз, поэтому компилятор может использовать ее для связывания. Во втором случае одна и та же переменная lo c назначается несколько раз, поэтому компилятор не может скомпилировать лямбда-функцию.

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