使用Groovy collect闭包将列表处理为分组子列表

使用Groovy collect闭包将列表处理为分组子列表,groovy,Groovy,给定我的小部件类: class Widget { String name WidgetType type boolean isRad } enum WidgetType { Fizz, Buzz, Foo } 我的groovy代码将被交给一个列表,可以这样填充: List<Widget> allWidgets = [] Widget w1 = new Widget(name: "W1", type: WidgetType.Fizz, isRad:

给定我的
小部件
类:

class Widget {
    String name
    WidgetType type
    boolean isRad
}

enum WidgetType {
    Fizz, Buzz, Foo
}
我的groovy代码将被交给一个
列表
,可以这样填充:

List<Widget> allWidgets = []
Widget w1 = new Widget(name: "W1", type: WidgetType.Fizz, isRad: true)
Widget w2 = new Widget(name: "W2", type: WidgetType.Fizz, isRad: true)
Widget w3 = new Widget(name: "W3", type: WidgetType.Buzz, isRad: false)
Widget w4 = new Widget(name: "W4", type: WidgetType.Buzz, isRad: false)
Widget w5 = new Widget(name: "W5", type: WidgetType.Foo, isRad: true)
Widget w6 = new Widget(name: "W6", type: WidgetType.Foo, isRad: false)

allWidgets << w1
allWidgets << w2
allWidgets << w3
allWidgets << w4
allWidgets << w5
allWidgets << w6
我相信这里可以使用
collect
闭包,但迄今为止我所有的尝试都失败了,我的最佳选择是:

allWidgets.collect { widget ->
    it.type
}

你知道我能在这里做什么吗?虽然我会接受纯Java的答案,但我真的希望得到一些真正优雅的东西,而且……好吧,groovy。

您需要的不是
收集
,而是
groupBy

allWidgets.groupBy { it.type }
因此,将返回一个
Map

演示:

枚举WidgetType{ 嘶嘶声、嗡嗡声、呜呜声 } 类小部件{ 字符串名 WidgetType类型 布尔isRad } 列出所有小部件=[ Widget w1=新的Widget(名称:“w1”,类型:WidgetType.Fizz,isRad:true), Widget w2=新的Widget(名称:“w2”,类型:WidgetType.Fizz,isRad:true), Widget w3=新小部件(名称:“w3”,类型:WidgetType.Buzz,isRad:false), Widget w4=新的Widget(名称:“w4”,类型:WidgetType.Buzz,isRad:false), Widget w5=新的Widget(名称:“w5”,类型:WidgetType.Foo,isRad:true), Widget w6=新的Widget(名称:“w6”,类型:WidgetType.Foo,isRad:false), ] def grouped=allWidgets.groupBy{it.type} List fizzWidgets=分组[WidgetType.Fizz] 列出buzzWidgets=grouped[WidgetType.Buzz] List fooWidgets=分组[WidgetType.Foo] 断言fizzWidgets.size()==2 断言fizzWidgets.every{it.type==WidgetType.Fizz} 断言buzzWidgets.size()==2 断言buzzWidgets.every{it.type==WidgetType.Buzz} 断言fooWidgets.size()==2 断言fooWidgets.every{it.type==WidgetType.Foo} 断言映射的分组实例 assert grouped.keySet()。每{it instanceof WidgetType} assert grouped.values().每{it instanceof List} assert grouped.values().flant().every{it instanceof Widget}
您可以找到
groupBy
文档。

您需要的不是
collect
,而是
groupBy

allWidgets.groupBy { it.type }
因此,将返回一个
Map

演示:

枚举WidgetType{ 嘶嘶声、嗡嗡声、呜呜声 } 类小部件{ 字符串名 WidgetType类型 布尔isRad } 列出所有小部件=[ Widget w1=新的Widget(名称:“w1”,类型:WidgetType.Fizz,isRad:true), Widget w2=新的Widget(名称:“w2”,类型:WidgetType.Fizz,isRad:true), Widget w3=新小部件(名称:“w3”,类型:WidgetType.Buzz,isRad:false), Widget w4=新的Widget(名称:“w4”,类型:WidgetType.Buzz,isRad:false), Widget w5=新的Widget(名称:“w5”,类型:WidgetType.Foo,isRad:true), Widget w6=新的Widget(名称:“w6”,类型:WidgetType.Foo,isRad:false), ] def grouped=allWidgets.groupBy{it.type} List fizzWidgets=分组[WidgetType.Fizz] 列出buzzWidgets=grouped[WidgetType.Buzz] List fooWidgets=分组[WidgetType.Foo] 断言fizzWidgets.size()==2 断言fizzWidgets.every{it.type==WidgetType.Fizz} 断言buzzWidgets.size()==2 断言buzzWidgets.every{it.type==WidgetType.Buzz} 断言fooWidgets.size()==2 断言fooWidgets.every{it.type==WidgetType.Foo} 断言映射的分组实例 assert grouped.keySet()。每{it instanceof WidgetType} assert grouped.values().每{it instanceof List} assert grouped.values().flant().every{it instanceof Widget}
您可以找到
groupBy
文档。

谢谢@Opal(+1)-我正在尝试查找
groupBy
上的文档,但运气不好。在上面的示例中,
def group
真的是一个
Map
?还是别的什么?看我的编辑。由于泛型在运行时被擦除,所以请查看其他断言语句。它们证明了
groupBy
类型以及键和值类型。感谢@Opal(+1)-我正在尝试查找
groupBy
上的文档,但没有真正的运气。在上面的示例中,
def group
真的是一个
Map
?还是别的什么?看我的编辑。由于泛型在运行时被擦除,所以请查看其他断言语句。它们证明了
分组的
类型以及键和值类型。
enum WidgetType {
    Fizz, Buzz, Foo
}

class Widget {
    String name
    WidgetType type
    boolean isRad
}

List<Widget> allWidgets = [
    Widget w1 = new Widget(name: "W1", type: WidgetType.Fizz, isRad: true),
    Widget w2 = new Widget(name: "W2", type: WidgetType.Fizz, isRad: true),
    Widget w3 = new Widget(name: "W3", type: WidgetType.Buzz, isRad: false),
    Widget w4 = new Widget(name: "W4", type: WidgetType.Buzz, isRad: false),
    Widget w5 = new Widget(name: "W5", type: WidgetType.Foo, isRad: true),
    Widget w6 = new Widget(name: "W6", type: WidgetType.Foo, isRad: false),
]

def grouped = allWidgets.groupBy { it.type }
List<Widget> fizzWidgets = grouped[WidgetType.Fizz]
List<Widget> buzzWidgets = grouped[WidgetType.Buzz]
List<Widget> fooWidgets = grouped[WidgetType.Foo]

assert fizzWidgets.size() == 2
assert fizzWidgets.every { it.type == WidgetType.Fizz }
assert buzzWidgets.size() == 2
assert buzzWidgets.every{ it.type == WidgetType.Buzz }
assert fooWidgets.size() == 2
assert fooWidgets.every { it.type == WidgetType.Foo }


assert grouped instanceof Map
assert grouped.keySet().every { it instanceof WidgetType }
assert grouped.values().every { it instanceof List }
assert grouped.values().flatten().every { it instanceof Widget }