Поток Java8: сбор элементов после выполнения условия - PullRequest
0 голосов
/ 11 сентября 2018

Мой POJO выглядит следующим образом

class EventUser {
  private id;
  private userId;
  private eventId;
}

Я получаю объект EventUser следующим образом:

List<EventUser> eventUsers = eventUserRepository.findByUserId(userId);

Скажите, что 'eventUsers' выглядит следующим образом:

[
{"id":"id200","userId":"001","eventId":"1010"},
{"id":"id101","userId":"001","eventId":"4212"},
{"id":"id402","userId":"001","eventId":"1221"},
{"id":"id301","userId":"001","eventId":"2423"},
{"id":"id701","userId":"001","eventId":"5423"},
{"id":"id601","userId":"001","eventId":"7423"}
]

Используя потоковую передачу и без использования какой-либо промежуточной переменной, как я могу фильтровать и собирать события после заданного EventUser.id: например:

List<EventUser> filteredByOffSet = eventUsers.stream.SOMEFILTER_AND_COLLECT("id301");

результат должен быть:

[{"id":"id301","userId":"001","eventId":"2423"},
{"id":"id701","userId":"001","eventId":"5423"},
{"id":"id601","userId":"001","eventId":"7423"}]

Ответы [ 4 ]

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

В Java 8 вам нужен фильтр с отслеживанием состояния

public static <T> Predicate<T> from(Predicate<T> test) {
    boolean[] found = { false };
    // once found, always true
    return t -> found[0] || (found[0] = test.test(t));
}

ПРИМЕЧАНИЕ: это имеет смысл только для однопоточных потоков.

List<EventUser> filteredByOffSet = 
     eventUsers.stream()
               .filter(from(e -> "id301".equals(e.getId()))
               .collect(Collectors.toList());
0 голосов
/ 11 сентября 2018

Сначала найдите индекс элемента поиска:

int asInt = IntStream.range(0, list.size())
    .filter(userInd-> list.get(userInd).equals(<criteria>))
    .findFirst()
    .getAsInt();

Получить элементы по и после индекса:

list.stream().skip(asInt).collect(Collectors.toList());
0 голосов
/ 11 сентября 2018

Вы не можете сделать это без использования каких-либо промежуточных переменных. найти позицию и повторить ее до конца (см. этот вопрос ниже, чтобы ответить на него более точно) введите описание ссылки здесь

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

Используйте " dropWhile " из Java 9.

...