Groovy GroupBy 变量键集

Groovy GroupBy Variable KeySet

提问人:Sean Missingham 提问时间:4/9/2020 更新时间:4/9/2020 访问量:105

问:

我正在努力使用时髦的groupBy

我需要支持按变量键集对数据集进行分组。

我已经写了一个测试来解释我的困境,并希望得到一些帮助来理解如何实现它:

https://groovyconsole.appspot.com/script/5155615986941952

List<Map> people = [
    [
        Sex: "Male",
        Age: 30,
        Job: "Programmer",
        Name: "Boris"
    ],
    [
        Sex: "Female",
        Age: 30,
        Job: "Programmer",
        Name: "Jennifer"
    ],
    [
        Sex: "Male",
        Age: 40,
        Job: "Web Designer",
        Name: "Bob"
    ],
    [
        Sex: "Female",
        Age: 20,
        Job: "Database Admin",
        Name: "Alice"
    ]
]


List results = []
if(people.groupBy({it.Sex}, {it.Age}) != groupBySpecifiedCols(people, ["Sex", "Age"])){
  return "Failed 1"
}

if(people.groupBy({it.Sex}, {it.Age}, {it.Job}) != groupBySpecifiedCols(people, ["Sex", "Age", "Job"])){
  return "Failed 2"
}

def groupBySpecifiedCols(List<Map> data, List<String> columns){
  // IMPLEMENT HERE

  return null
}


return "Success!"​​​​
Java Groovy 闭包

评论


答:

2赞 Sean Missingham 4/9/2020 #1

实际上,我认为我只是解决了它,经过几个小时的挫败感,结果很简单:

def groupBySpecifiedCols(List<Map> data, List<String> columns){
  List<Closure> groupByClosures = []
  columns.each{ column ->
    groupByClosures << { it[column] }
  }

  return data.groupBy(groupByClosures)
}

编辑 正如评论中指出的那样,有一种可能更简洁的方法:

def groupBySpecifiedCols(List<Map> data, List<String> columns){
  return data.groupBy(columns.collect{ col -> ((Closure){ it[col] })})
}

评论

0赞 Sean Missingham 4/9/2020
多么尴尬,在我清理 SO 测试时找到了答案......希望这至少对将来对其他人有所帮助
1赞 cfrick 4/9/2020
那个 + 可以用 写成 。each<<collect
1赞 tim_yates 4/9/2020
是的,函数的主体可以替换为:data.groupBy columns.collect { column -> { it."$column" } }
0赞 Sean Missingham 4/9/2020
谢谢,添加回答 - 但必须强制转换以避免编译中的歧义错误
1赞 tim_yates 4/10/2020
啊......或者使用这样时髦就知道它是一个闭合{ it -> it."$column" }