Search code examples
javajava-streamgroupingcollectors

Java group by then collect to list of custom objects


I have a stream of Element from csv file

public class Element {
    private String site;
    private String value;
    private Date date;
...
}

and I want to group elements by site to a list of Stat objects

public class Stat {
    private List<Info> infos;
    private String site;

    public Stat (String site, List<Info> infos) {
...
    }
}

public class Info {
    private String value;
    private Date date;
...
}

Here's where I am

Map<String, List<Element>> elementsBySite = elements.stream().collect(Collectors.groupingBy(Element::getSite));

is it possible to re-map my list of Element to a list of stat in a single ?

something like

Map<String, List<Stats>> statsBySite = elements
    .stream()
    .collect(Collectors.groupingBy(Element::getSite, 
        Collectors.collectingAndThen(Collectors.toList(), 
             // transform each element to Info
             // then create a Stats object with all infos for a given site
));

Solution

  • Use Collectors.mapping as a downstream to groupingBy like:

    Map<String, List<Stat>> elementsBySite = elements.stream()
            .collect(Collectors.groupingBy(Element::getSite,
                    Collectors.mapping(e -> convertElementToStat(e),
                            Collectors.toList())));
    

    where the signature of the util would be as:

    Stat convertElementToStat(Element element);