【问题标题】:Groovy GroupBy Variable KeySetGroovy GroupBy 变量键集
【发布时间】:2020-04-09 09:49:34
【问题描述】:

我正在努力使用 groovy 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 closures


    【解决方案1】:

    其实我想我刚刚解决了,经过几个小时的挫折,结果很简单:

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

    EDIT 正如 cmets 中所指出的,有一种可能更简洁的方法:

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

    【讨论】:

    • 多么尴尬,在我为 SO 清理测试时找到了答案......希望这至少可以帮助其他人在未来
    • each+&lt;&lt;可以写成collect
    • 是的,你的函数体可以替换为:data.groupBy columns.collect { column -&gt; { it."$column" } }
    • 谢谢,添加到答案中-但必须强制转换以避免编译中的歧义错误
    • Ahhhh... 或者使用 { it -&gt; it."$column" } 让 groovy 知道这是一个闭包
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多