Есть ли способ отфильтровать список по значению поля первого объекта в этом списке? - PullRequest
0 голосов
/ 29 января 2019

У меня огромный список с объектами журналирования, и мне нужно принимать только первые n записей на основе значения поля первого объекта (list.get(0).getId())

Я делаю так:

List<Event> list = asList(
                new Event("id_1", "value_1" ...), 
                new Event("id_1", "value_2" ...), 
                new Event("id_1", "value_3" ...),
                new Event("id_2", "value_4" ...),
                new Event("id_2", "value_5" ...),
                new Event("id_2", "value_6" ...));
        String id = events.get(0).getId();
        return list.stream()
                .filter(event -> event.getId().equals(id))
                .collect(toList());

И это работает, но это выглядит не так.Можете ли вы дать мне совет, как сделать это лучше?

1 Ответ

0 голосов
/ 29 января 2019

Если вы хотите избежать первоначального доступа к списку (чтобы получить Id первого события), вы можете сгруппировать события по Id и вернуть первую группу событий:

return list.stream()
           .collect(Collectors.groupingBy(Event::getId,
                                          LinkedHashMap::new,
                                          Collectors.toList()))
           .values()
           .iterator()
           .next();

PS если список может быть пустым, вам все равно нужно проверить, что .values().iterator().hasNext().

...