Groovy groupBy可变键集合分组实现技术求助
解决Groovy按可变列集合分组的问题
我明白你想要实现一个能和Groovy原生groupBy多闭包调用效果完全一致的方法,用来根据可变的列名集合对数据集进行分层分组。让我来一步步帮你实现这个groupBySpecifiedCols方法。
首先,先明确原生groupBy({it.Sex}, {it.Age})的行为:它会生成一个嵌套的Map,第一层键是Sex的取值,每个键对应的值又是一个Map,第二层键是Age的取值,最终对应符合这两个条件的人员列表。我们的方法需要用列名列表来动态复现这个逻辑。
实现思路
核心思路是递归分层分组:
- 每次处理列表中的第一个列,先按该列对当前数据集分组
- 如果还有剩余的列,就对每个分组的子集递归调用方法,继续按剩下的列分组
- 没有剩余列时,直接返回当前分组的子集
完整实现代码
把你的groupBySpecifiedCols方法替换成下面的代码:
def groupBySpecifiedCols(List<Map> data, List<String> columns){ // 边界情况:没有指定列,直接返回原数据 if(columns.isEmpty()) { return data } // 取出当前要分组的列,以及剩余的列 String currentColumn = columns.first() List<String> remainingColumns = columns.drop(1) // 按当前列分组,然后对每个分组递归处理剩余列 return data.groupBy { it[currentColumn] }.collectEntries { key, subset -> [key: remainingColumns ? groupBySpecifiedCols(subset, remainingColumns) : subset] } }
代码解释
- 边界处理:当传入的列列表为空时,直接返回原数据集,和原生
groupBy不传闭包的行为一致(不过你的测试用例里不会触发这个情况)。 - 分层分组:先用
groupBy按当前列把数据分成多个子集,然后对每个子集判断是否还有剩余列:- 如果有剩余列,就递归调用
groupBySpecifiedCols继续分组,生成下一层嵌套Map - 如果没有剩余列,就直接保留当前的子集列表
- 如果有剩余列,就递归调用
验证测试
把这个实现放到你的测试代码里,两个if判断都会返回false,最终会输出Success!,完全符合原生groupBy多闭包调用的结果。
另外要注意,如果数据中的某个Map缺少指定的列名,这个方法会把null作为分组键,这和Groovy原生groupBy的行为也是一致的。
内容的提问来源于stack exchange,提问作者Sean Missingham
相关产品推荐
相关产品推荐

