Какой самый оптимальный способ получить набор строк, который присутствует в середине списка в Java 8? - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть список предметов.Я хочу обработать набор элементов, которые находятся в середине списка.Пример: предположить список сотрудников, которые имеют в качестве атрибутов идентификатор, имя, фамилию и отчество.Я хочу рассмотреть все строки между lastName "xxx" и "yyy" и обработать их дальше.Как это можно оптимизировать в Java8?Оптимизация - моя первая забота.Пробовал использовать потоки Java8 и параллельные потоки.Но завершение (останов) не допускается в цикле foreach в потоках Java8.Также мы не можем использовать внешние переменные «start» ниже внутри foreach.Ниже приведен код, который мне нужно оптимизировать:

boolean start = false;
for(Employee employee: employees) {
    if(employee.getLastname().equals("yyy")) {
        break;
    } 
    if(start) {
    // My code to process
    }
    if(employee.getLastname().equals("xxx")) {
        start = true;
    }
}

Как лучше всего решить вышеуказанную проблему в Java8?

1 Ответ

0 голосов
/ 24 сентября 2018

Это возможно в java-9 с помощью (я упростил ваш пример):

Stream.of(1, 2, 3, 4, 5, 6)
            .dropWhile(x -> x != 2)
            .takeWhile(x -> x != 6)
            .skip(1)
            .forEach(System.out::println);

Это позволит получить значения в диапазоне 2 - 6, то есть вывести 3,4,5.

Или для вашего примера:

employees.stream()
         .dropWhile(e -> e.getLastname().equals("xxx"))
         .takeWhile(e -> e.getLastname().equals("yyy"))
         .skip(1)
         .forEach(....)

Есть задние порты для dropWhile и takeWhile, см. здесь и здесь

РЕДАКТИРОВАТЬ

Или вы можете сначала получить индексы этих разделителей, а затем сделать subList (но это предполагает, что xxx и yyy уникальныв списке сотрудников):

int[] indexes = IntStream.range(0, employees.size())
            .filter(x -> list.get(x).getLastname().equals("xxx") || list.get(x).getLastname().equals("yyy"))
            .toArray();

employees.subList(indexes[0] + 1, indexes[1])
            .forEach(System.out::println);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...