见证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() : []
递归调用这个是必须的*.allChildren.flatten()。
短短一行代码,展现了五个Grovvy的知识点:
(1)可以省略 return 。这对不愿多打一个字母的懒人来说也是不小的福利;
(2)[]。这可不是数组,在Groovy中最常见的列表List;
(3)操作符重载:List 的 “ + ” 运算符。assert [1,2,3,4] == [1,2] + [3,4];
(4)*展开元素操作符。自动对List中的每个元素进行枚举操作,不用为此写一个for循环了;
(5)flatten() 。这是实现此算法的关键,它将所有递归得到的嵌套子节点List使用flatten操作,
得到一个一维的Group列表。List的这个flatten()方法能作到:
assert [1,2,3,4,5] == [1,[2,3],[[4]],[],5].flatten()
至此,一个完全可用的树状结构领域模型完成了,你可以调用Grails的GORM语法糖addToChildren,removeFromChildren 任意的添加/删除子节点,save,delete这些神奇的GORM方法自不用说,更不用写Hibernate的XML。
分享到:
相关推荐
根据当前节点获取所有父节点信息(18代)SQL根据当前节点递归遍历获取所有父节点信息,短短的SQL可以解决复杂的问题
sql 查询 所有子节点 方法已经调试通过(sql-server 2005)
我们在实际的开发当中经常要获取页面中某个html元素,动态的更新该元素的样式、内容属性等。 那么如何获取要更新的这些元素呢?用JavaScript获取这些节点的方法有很多种,下面是总结的一些方法.
QTreeView递归实现展开或者闭合某个节点下面的所有子节点 不是一键展开所有,是展开你要操作的节点下面的所有子节点!
主要介绍了MySQL实现树状所有子节点查询的方法,涉及mysql节点查询、存储过程调用等操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
带复选框的多级目录树,复选框的选择控制子节点父节点 全选和反选 通过子节点控制父节点及以上父节点是否要选中
下面小编就为大家带来一篇使用递归删除树形结构的所有子节点(java和mysql实现)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
实现echarts中的树形tree图的节点收缩功能,子节点最多支持扩展9个,通过value作为层级的标识.能够完美实现子节点的缩放功能.
代码 博文链接:https://blueskylan.iteye.com/blog/848447
10.树状结构可以选择出现在某一列,不一定要在第一列 11.支持theme,纯css定制表格树,可以自由定制theme,包括图标/节点大小等 12.表格树从右到左显示 13.本地节点搜索,服务器端节点搜索(未实现待完成) 14.无变化重新...
MySQL实现树状所有子节点查询的方法function
Ext2.0不仅仅实现了复选框的树形菜单,而且使得在选中某个节点时,如果有子节点,那么就能够将所有的字节点全部选中,当然你也可以直接选择你希望的节点。但是,当你第一次选中某个有子节点但是子节点并没有展开的...
树结构,点击父结构,获取子结构数据。 通过lv.setSingle(false);设置是单选还是多选 List<TreeElement> treeElements = parser.getTreeElements_system(listSystemInfo, 1, true);// 解析读出的文件资源内容 最后...
MFC中,动态添加、删除树形控件的节点,获取树形控件的选中项,绝对经典 !希望对你有所帮助!
treeWidget动态改动每个节点。由主节点、子节点、删除、编辑。 每个节点是由选项框选中的,并且关联了父节点。也就父节点勾选中后,子节点都会勾选中。
Vue实现树形结构,不采用tree组件,利用循环方式得到;实现全选,勾选父节点自动勾选子节点,勾选子节点反勾选相应父节点功能
递归找到当前的节点呈现树形菜单结构,所有的信息存储在一个表中 递归遍历所有节点信息 依次展示所有子节点
react-antd table树形数据默认展开行实现jsx文件
在用户权限里,系统菜单选中一个用户后,他的Treeview权限菜单,点击父节点,子节点自动展开并选中。asp.net的Treeview的Checkbox选中父节点,选中全部子节点并且展开。
android实现简单的多选结构树,勾选父节点全选子节点等功能,可以根据自己需要修改.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。