有什么方法可以通过列表中第一个对象的字段值过滤列表?

时间:2019-01-29 07:49:09

标签: java java-8 java-stream

我有大量记录对象的列表,我只需要基于第一个对象字段值(list.get(0).getId())的前n个条目

我这样做:

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 :(得分:0)

如果要避免对列表的初始访问(以获取第一个事件的ID),则可以按ID对事件进行分组,然后返回第一组事件:

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

P.S。如果列表可以为空,则仍然需要检查.values().iterator().hasNext()