Java 列表上的动态分组和聚合<;地图<;字符串,对象>>;-爪哇8

Java 列表上的动态分组和聚合<;地图<;字符串,对象>>;-爪哇8,java,dynamic,java-8,group-by,aggregate,Java,Dynamic,Java 8,Group By,Aggregate,我想对维度(ad_id和medium_type,可以是动态的,随用户输入而变化)执行groupby操作,并聚合度量(也可以是动态的,随用户输入而变化)。在本例中,groupby根据上面示例中的ad_id和medium_type,聚合度量印象,最终结果如下所示 //joinedList: [{ad_id=8710, medium_type=2, impressions=36}, {ad_id=8710, medium_type=2, impressions=1034}, {ad_id=9000,

我想对维度(ad_id和medium_type,可以是动态的,随用户输入而变化)执行groupby操作,并聚合度量(也可以是动态的,随用户输入而变化)。在本例中,groupby根据上面示例中的ad_id和medium_type,聚合度量印象,最终结果如下所示

 //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}]

注意:group by字段(上面的ad_id、medium_类型)可以是动态的,并且由用户输入的内容驱动。它们可以是除广告id、中等类型之外的任何类型。同样,对于度量,用户可能对印象、点击、度量3、度量4感兴趣。

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

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

@allargsconstuctor
静态课堂记录{
整数adId;
整数媒体类型;
长印象;
//注意:这些是仅用于求和运算的标识
静态记录标识(){
返回新记录(0,0,0L);
}
静态函数classifierToGroupBy(){
返回r->Arrays.asList(r.adId,r.mediumType);//使其成为动态的
}
静态二进制运算符mergeOperationInDownstream(){
return(a,b)->新记录(a.adId,a.mediumType,
a、 impressions+b.impressions);//动态字段和操作选择
}
}
公共列表processData(列表记录){
返回新的ArrayList(records.stream()
.collect(Collectors.groupingBy(Record.classifierToGroupBy()),
收集器.减少(Record.identity(),Record.mergeOperationInDownstream())
.values());
}

当你说动态时,你也必须考虑操作的类型,对吧?要决定这方面的方法,您必须确定一组最终的操作和执行这些操作的类型。您能否分享不同用户输入的可能示例,以及如何进一步处理它们?
 //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}]
//final output: [{ad_id=8710, medium_type=2, impressions=1070}, {ad_id=9000, medium_type=2, 
impressions=10}]
@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());
}