问题

我想对此进行一些分类:

Map rowToMap(row) {
    def rowMap = [:];
    row.columns.each{ rowMap[it.name] = it.val }
    return rowMap;
}

考虑到GDK的方式,我希望能够做到这样的事情:

Map rowToMap(row) {
    row.columns.collectMap{ [it.name,it.val] }
}

但是我没有在文档中看到任何东西......我错过了什么吗?还是我太懒了?


#1 热门回答(104 赞)

我最近遇到了这样做的需要:将列表转换为 Map 。这个问题是在Groovy 1.7.9版本发布之前发布的,所以方法collectEntries还不存在。它的工作原理与collectMapmethodthat was proposed完全相同:

Map rowToMap(row) {
    row.columns.collectEntries{[it.name, it.val]}
}

如果由于某种原因你遇到了较旧的Groovy版本,也可以使用inject方法(如建议的here)。这是一个稍微修改过的版本,在闭包内只占用一个表达式(只是为了保存字符!):

Map rowToMap(row) {
    row.columns.inject([:]) {map, col -> map << [(col.name): col.val]}
}

也可以使用+操作符代替<<


#2 热门回答(28 赞)

看看"注入"。真正的函数式编程让人称之为"折叠"。

columns.inject([:]) { memo, entry ->
    memo[entry.name] = entry.val
    return memo
}

而且,当你在它的时候,你可能想要在metaClass上将方法定义为Categories而不是right。这样,你可以为所有集合定义一次:

class PropertyMapCategory {
    static Map mapProperty(Collection c, String keyParam, String valParam) {
        return c.inject([:]) { memo, entry ->
            memo[entry[keyParam]] = entry[valParam]
            return memo
        }
    }
}

用法示例:

use(PropertyMapCategory) {
    println columns.mapProperty('name', 'val')
}

#3 热门回答(13 赞)

当问到这个问题时,groupBy方法不可用吗?


原文链接