Заменить цикл for-each на лямбда-выражение - PullRequest
0 голосов
/ 24 апреля 2018

Я просто делаю рефакторинг некоторых своих старых проектов, чтобы использовать функции Java 8.

int counter = 1;
for (Checker checker : checkers) {
    if (counter < checkers.size()) {
        checker.setNextChecker(checkers.get(counter++));
    }
}

Вот своего рода шаблон цепочки респирации.И мне нужно установить следующую проверку для каждой проверки в списке, за исключением последней.

Все еще не могу найти способ использовать Stream API здесь:)

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Безумная альтернатива:

Iterator<Checker> currentIt = checkers.subList(0, checkers.size() - 1).iterator();
Iterator<Checker> nextIt = checkers.subList(1, checkers.size()).iterator();
while (currentIt.hasNext()) {
  currentIt.next().setNextChecker(nextIt.next());
}

Полагаю, вы могли бы написать это с помощью одного итератора:

Iterator<Checker> it = checkers.iterator();
Checker previous = it.next();
while (it.hasNext()) {
  previous.setNextChecker(previous = it.next());
}

Но если предположить, что ваш список небольшой, а RandomAccess, я бы просто придерживался цикла на основе индекса:

for (int i = 0; i < checker.size()-1; ++i) {
  checkers.get(i).setNextChecker(checkers.get(i+1));
}

Потоки здесь не очень полезны.

0 голосов
/ 24 апреля 2018

Использование IntStream.range:

IntStream.range(1, checkers.size())
         .forEach(i -> checkers.get(i-1).setNextChecker(checkers.get(i)));

или использование цикла for:

for (int i = 1; i < checkers.size(); i++) 
      checkers.get(i-1).setNextChecker(checkers.get(i));
...