Java8 Stream: собирать элементы после выполнения условия
Мой 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: ex:
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"}]
Ответы
Ответ 1
В 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());
Ответ 2
Используйте " dropWhile " из Java 9.
Ответ 3
Сначала найдите индекс элемента поиска:
int asInt = IntStream.range(0, list.size())
.filter(userInd-> list.get(userInd).equals(<criteria>))
.findFirst()
.getAsInt();
Получать товары по индексу и после него:
list.stream().skip(asInt).collect(Collectors.toList());
Ответ 4
Вы не можете сделать это без использования каких-либо промежуточных переменных. нахождение позиции и повторение ее до конца (см. ниже этот вопрос, ответьте более точно) введите описание ссылки здесь