Groovy / Grails groupBy字段名称的动态列表

时间:2015-08-20 09:27:50

标签: list grails groovy

我想通过动态字段列表(按名称给出)对对象列表进行分组。我将尝试用一个例子来解释它。

假设我有一个类似于此的课程:

def SomeClass{
    String one
    String two
    String three
    String four
    //etc..
}  

现在我有一个包含1-4个字段名称的可更改列表,因此硬编码不是一个选项,如下所示:

def fields = ["one", "two"]
//or
def fields2 = ["two", "three", "four"]

我想对SomeClass的列表进行排序,结果我需要一个映射,其中值列表为键,对象为值;看起来像这样:

//group by fields:
def result = [[someClass.one, someClass.two]:[List<SomeClass>],...]
//group by fields2:
def result2 = [[someClass.two, someClass.three, someClass.four]:[List<SomeClass>],...]

我尝试拆分字段并为.groupBy()创建闭包,但我检索了一个嵌套的Map。

使用.collectEntries()我不知道如何将可更改的字段列表传递给闭包。

我想要排序的列表包含大约500-10000个元素,我想要分组1-4个字段。

1 个答案:

答案 0 :(得分:2)

您可以将groupByClosurecollect字段一起使用:

import groovy.transform.*

@Canonical
class SomeClass{
    String one
    String two
    String three
} 

List<SomeClass> list = [
    new SomeClass('a', '1', 'i'),
    new SomeClass('a', '1', 'ii'),
    new SomeClass('a', '2', 'i'),
    new SomeClass('a', '2', 'ii'),
    new SomeClass('a', '3', 'i'),
]

def fields = ['one', 'two']

Map<List<String>,List<SomeClass>> grouped = list.groupBy { o -> fields.collect { o."$it" } }

assert grouped == [
    ['a', '1']:[new SomeClass('a', '1', 'i'), new SomeClass('a', '1', 'ii')],
    ['a', '2']:[new SomeClass('a', '2', 'i'), new SomeClass('a', '2', 'ii')],
    ['a', '3']:[new SomeClass('a', '3', 'i')]
]