Установить свойство каждого объекта в списке с помощью forEach (Ошибка: локальные переменные, на которые ссылается лямбда-выражение, должны быть окончательными или эффективно окончательными) - PullRequest
2 голосов
/ 20 апреля 2019

У меня есть список матчей. У матча есть свойство matchIndex. Теперь я хочу установить свойство каждого совпадения в списке следующим образом:

index = 0 // some predefined value

List<Match> matchList = createMatches(membersList, teamsPerGroup,totalGroups);
    matchList.forEach((match) -> {
    match.setMatchIndex(index++);
});

Я хочу установить matchIndex для каждого совпадения в списке, увеличивая порядок после индекса локальной переменной.

Ответы [ 2 ]

2 голосов
/ 20 апреля 2019

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

IntStream.range(0, matchList .size())
            .mapToObj(index -> {
                Match match= list.get(index);
                match.setMatchIndex(index);
                return match;
            })
            .collect(Collectors.toList());

или использовать AtomicInteger

AtomicInteger index= new AtomicInteger(1);
matchList.forEach(match-> match.setMatchIndex(index.getAndAdd(1)));

ОБНОВЛЕНИЕ:

Как прокомментировал @HolgerПравильное решение -

IntStream.range(0, matchList.size()) 
         .forEach(index -> matchList.get(index) .setMatchIndex(index));

, и если вы хотите использовать какое-то предопределенное значение, это правильное решение:

 IntStream.range(0, matchList.size()) 
          .forEach(index -> matchList.get(index) .setMatchIndex(index + offset));
0 голосов
/ 20 апреля 2019

На самом деле, есть ленивый способ сделать это, но это не способ Java 8. Тем не менее, я отправляю этот ответ:)

int index = 0; // starting index

for (Match match: matchList) {
    match.setMatchIndex(matchIndex++);
}

Надеюсь, это поможет.

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