使用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 }