我想通过动态字段列表(按名称给出)对对象列表进行分组。我将尝试用一个例子来解释它。
假设我有一个类似于此的课程:
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个字段。
答案 0 :(得分:2)
您可以将groupBy
与Closure
和collect
字段一起使用:
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')]
]