见证Groovy/Grails的神奇时刻到了,你相信吗?用一行代码就能够获取树状结构中某节点下的全部所有子节点!注意:这个树是无深度限制的。无深度限制这点很重要,若是有限深度的树,那咱们也很容易经过层级编码用“Like 001%”方式实现(维护编码也是一个有挑战性活)。咱们以一个很是常见的“类别”Domain为例,大类分小类,小类再细分,典型的树形结构,看看Grails是如何以简洁的语法表达的,体验Groovy语法的神奇!算法
class Group{ String name static hasMany = [children:Group] static belongsTo = [parent: Group] static transients = ['allChildren'] def getAllChildren(){ children ? children + children*.allChildren.flatten() : [] } }
1.两行代码表述一个树状结构,同时Grails自动为你生成数据库表数据库
static hasMany = [children:Group] static belongsTo = [parent: Group]
2.一行代码获取任意深度的所有子节点:数组
children ? children + children*.allChildren.flatten() : []
短短一行代码,展示了五个Grovvy的知识点:编码
(1)能够省略 return 。这对不肯多打一个字母的懒人来讲也是不小的福利;spa
(2)[]。这可不是数组,在Groovy中最多见的列表List;code
(3)操做符重载:List 的 “ + ” 运算符。assert [1,2,3,4] == [1,2] + [3,4];blog
(4)*展开元素操做符。自动对List中的每一个元素进行枚举操做,不用为此写一个for循环了;递归
(5)flatten() 。这是实现此算法的关键,它将全部递归获得的嵌套子节点List使用flatten操做,rem
获得一个一维的Group列表。List的这个flatten()方法能做到:get
assert [1,2,3,4,5] == [1,[2,3],[[4]],[],5].flatten()
至此,一个彻底可用的树状结构领域模型完成了,你能够调用Grails的GORM语法糖addToChildren,removeFromChildren 任意的添加/删除子节点,save,delete这些神奇的GORM方法自不用说,更不用写Hibernate的XML。