Grails findAll и GroupBy - PullRequest
       101

Grails findAll и GroupBy

1 голос
/ 01 мая 2020

У меня есть класс домена с 3 полями: имя, возраст и город. Я хотел бы найти всех с ограничением по возрасту и группам по городам. Это мой код:

import groovy.transform.*
@Canonical
class Person{
    String name
    int age
    String city
} 
List<Person> list = [
    new Person('Jey', 42, 'New'),
    new Person('Leo', 25, 'New'),
    new Person('Dan', 29, 'New'),
    new Person('Alex', 36, 'Fran'),
    new Person('Doe', 34, 'Lon'),
    new Person('Tim', 34, 'Lon'),
    new Person('Jin', 34, 'Lon'),
    new Person('Bob', 34, 'Par'),  
    new Person('Ken', 37, 'Par'),    
]
groupByCity = list.findAll{it.age < 36}.groupBy{it.city}.collectEntries{key, value -> [(key): [value.age, value.name]]}
println groupByCity

Что мне нужно:

[New:[[25,Leo], [29, Dan]], Lon:[[34, Doe], [34, Tim]..

или

 [New:[[25:Leo], [29: Dan]], Lon:[[34: Doe], [34: Tim]..

но я получил

 [New:[[25, 29], [Leo, Dan]], Lon:[[34, 34, 34], [Doe, Tim, Jin]], Par:[[34], [Bob]]]

Контекст: я хочу извлечь объекты из группы классов домена по полю и показать два, отправить эти списки в представление.

1 Ответ

2 голосов
/ 01 мая 2020

Это потому, что значение является списком, а [value.age, value.name] приводит к [[25, 29], [Leo, Dan]] ...

Добавьте вызов сбора для извлечения желаемого результата -

list
.findAll{it.age < 36}
.groupBy{it.city}
.collectEntries{key, value -> [(key): value.collect{ [it.age, it.name] }]} 
...