Using Groovy collect closure to process list into grouped sublists -


given widget class:

class widget {     string name     widgettype type     boolean israd }  enum widgettype {     fizz, buzz, foo } 

my groovy code handed list<widget> may populated so:

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 

what want accomplish grouping of elements in allwidgets according widget#type. effectively, turning above list multiple lists (1 per type) so:

list<widget> fizzwidgets = [] list<widget> buzzwidgets = [] list<widget> goowidgets = [] 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)  fizzwidgets << w1 fizzwidgets << w2  buzzwidgets << w3 buzzwidgets << w4  foowidgets << w5 foowidgets << w6 

i believe collect closure can used here, attempts far have failed, best being:

allwidgets.collect { widget ->     it.type } 

any ideas can here? , while accept pure java answer, i'm hoping elegant and...well, groovy.

what need not collect groupby:

allwidgets.groupby { it.type } 

as result map<widgettype, list<widget>> returned.

demo:

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 { instanceof widgettype } assert grouped.values().every { instanceof list } assert grouped.values().flatten().every { instanceof widget } 

here can find groupby docs.


Comments