【问题标题】:Java group by then collect to list of custom objectsJava group by 然后收集到自定义对象列表
【发布时间】:2019-05-07 10:22:18
【问题描述】:

我有来自 csv 文件的 Element

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

我想按site 将元素分组到Stat 对象列表中

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;
...
}

我在这里

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

是否可以将我的 Element 列表重新映射到单个 stat 列表中?

类似

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
));

【问题讨论】:

    标签: java java-stream grouping collectors


    【解决方案1】:

    使用Collectors.mapping 作为groupingBy 的下游,例如:

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

    util 的签名如下:

    Stat convertElementToStat(Element element);
    

    【讨论】:

    • 感谢您的回答,但我需要一个 Stat 对象,它将 Info 列表作为参数。首先将 Element 转换为 Info 并获取 Info 列表以创建 Stat。我应该链接收集器吗?跨度>
    • @boizor 从这个问题中不太清楚,你能分享一个最小的代码来显示Info 类在你所说的转换中的作用吗?
    • 刚刚编辑了我的问题。 Element 可以映射到 InfoStat 对象是包含给定站点所有信息的包装器。
    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多