首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Object>> -Java8的List<Map<String动态分组和聚合

问基于Object>> -Java8的List<Map<String动态分组和聚合
EN

Stack Overflow用户
提问于 2019-12-12 06:22:38
回答 1查看 162关注 0票数 0
代码语言:javascript
复制
@Test
public void testAggregation() {
    List<Map<String, Object>> joinedList = new ArrayList<>();
    Map<String, Object> Myrecord = new HashMap<> ();
    Map<String, Object> Myrecord2 = new HashMap<> ();
    Map<String, Object> Myrecord3 = new HashMap<> ();

    Myrecord.put("ad_id", 8710);
    Myrecord.put("medium_type", 2);
    Myrecord.put("impressions", 36);
    joinedList.add(Myrecord);
    Myrecord2.put("ad_id", 8710);
    Myrecord2.put("medium_type", 2);
    Myrecord2.put("impressions", 1034);
    joinedList.add(Myrecord2);
    Myrecord3.put("ad_id", 9000);
    Myrecord3.put("medium_type", 2);
    Myrecord3.put("impressions", 10);
    joinedList.add(Myrecord3);
    System.out.println("Myrecord:" + joinedList);
    //joinedList: [{ad_id=8710, impressions=36, medium_type=2}, {ad_id=8710, impressions=1034, medium_type=2}, {ad_id=9000, impressions=10, medium_type=2}]
}

我有一个用例,其中我需要从两个表中提取相同的模式集,并聚合这两个表中的数据。我的想法是分别查询表,并将它们保存在List>中,然后合并它们。一旦我合并它们-示例输出如下所示

代码语言:javascript
复制
 //joinedList: [{ad_id=8710, medium_type=2, impressions=36}, {ad_id=8710, medium_type=2, impressions=1034}, {ad_id=9000, medium_type=2, impressions=10}]

我想对维度(ad_id和medium_type,它们可以是动态的,随用户输入而变化)执行分组操作,并聚合指标(它们也是动态的,随用户输入而变化)。在该示例中,对上面示例中的ad_id和medium_type使用groupby,并聚合指标印象,最终结果应如下所示

代码语言:javascript
复制
//final output: [{ad_id=8710, medium_type=2, impressions=1070}, {ad_id=9000, medium_type=2, 
impressions=10}]

注意: group by字段(上面的ad_id、medium_type )可以是动态的,并且由用户输入的内容驱动。它们可以是除ad_id、medium_type之外的任何东西。同样,指标也是如此,用户可能对印象、点击、metric3、metric4感兴趣。

EN

回答 1

Stack Overflow用户

发布于 2019-12-12 12:20:07

因为这不适合在评论中使用。我相信你的实际问题是在定义要执行的操作时寻找动态性。但正如评论中指出的,这将需要一些决定性的操作集来决定一种方法。

例如,使用当前的描述,您可以在以下行执行某些操作(请注意,注释可能会突出显示您正在询问的实际问题):

代码语言:javascript
复制
@AllArgsConstructor
static class Record {
    Integer adId;
    Integer mediumType;
    Long impressions;

    // note these are identity only for sum operation
    static Record identity() {
      return new Record(0, 0, 0L);
    }

    static Function<Record, List<Object>> classifierToGroupBy() {
      return r -> Arrays.asList(r.adId, r.mediumType); // make this dynamic
    }

    static BinaryOperator<Record> mergeOperationInDownstream() {
        return (a, b) -> new Record(a.adId, a.mediumType, 
              a.impressions + b.impressions); //dynamic field and operation selection
    }
}

public List<Record> processData(List<Record> records) {
    return new ArrayList<>(records.stream()
            .collect(Collectors.groupingBy(Record.classifierToGroupBy(),
                    Collectors.reducing(Record.identity(), Record.mergeOperationInDownstream())))
            .values());
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59295011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档