见证Groovy/Grails的神奇时刻到了,你相信吗?用一行代码就可以获取树状结构中某节点下的所有全部子节点!注意:这个树是无深度限制的。无深度限制这点很重要,如果有限深度的树,那我们也很容易通过层级编码用“Like 001%”方式实现(维护编码也是一个有挑战性活)。我们以一个非常常见的“类别”Domain为例,大类分小类,小类再细分,典型的树形结构,看看Grails是如何以简洁的语法表达的,体验Groovy语法的神奇!

class Group{String namestatic 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。

转载于:https://www.cnblogs.com/xhyper/p/4442552.html

神奇的Grails:自关联的树状Domain一行代码获取所有子节点相关推荐

  1. 家谱html源码,好看的族谱树状图效果代码

    家谱树状代码 demo by www.webym.net /*Now the CSS*/ * {margin: 0; padding: 0;} .tree ul { padding-top: 20px ...

  2. sql 树状结构中知道 父节点与孙节点_sqlserver树状结构表中,获取指定节点的所有父节点路径_MySQL...

    CREATE PROCEDURE [dbo].[A_P_GetParentIds] ( @IdValue NVARCHAR(36) ,-- 子节点值 @tableName NVARCHAR(MAX) ...

  3. 一段树状无限制级代码

    1 数据库对应实体 ReportDeleteIndex.java /*** 作者 : *** 时间 : 20170519* 类描述 : 问题屏蔽* 表 TB_JN_INDEX_DELETE * */ ...

  4. echarts树状图怎么设置主节点和子节点的距离_教你秒懂CAD出图比例正确设置技巧...

    1.你知道你用CAD画出的图打印出来会是多大吗? 2.你知道你图中标注文字打印出来字高是多少mm吗? 3.你能确定你画的1:100的图打印出来比例确实是1:100吗? 这个问题乍一看似乎简单,研究起来 ...

  5. 树状数组-Java代码纯享版

    /**原始数组下标从0开始,bitTree数组下标从1开始,目的是为了符合lowbit操作,lowbit可以理解为构造新数组的一种方法(比较直观简单的理解) **/ public class BITD ...

  6. bzoj 4871: [Shoi2017]摧毁“树状图”

    4871: [Shoi2017]摧毁"树状图" Time Limit: 25 Sec  Memory Limit: 512 MB Submit: 53  Solved: 9 [Su ...

  7. mysql的树状表结构设计。

    公司要做一个树状结构,列表展示的时候不仅要有节点信息,还要有该节点的路径信息. 众所周知mysql没有oracle 的递归查询,如果Java代码中查询的话.列表页几十条数据.在每个节点层数不定时,其实 ...

  8. 简单の暑假总结——树状数组

    2.1 树状数组 树状数组,顾名思义,长得像树的数组,用于处理一些单点修改以及区间查询的问题.其时间复杂度为 O(log⁡2n)O(\log _2n)O(log2​n) .如过我们使用一些一般的数据结 ...

  9. AcWing 蓝桥杯AB组辅导课 05、树状数组与线段树

    文章目录 前言 一.树状数组 1.1.树状数组知识点 1.2.树状数组代码模板 模板题:AcWing 1264. 动态求连续区间和 例题 例题1.AcWing 1265. 数星星[中等,信息学奥赛一本 ...

最新文章

  1. k-means-algorithm
  2. kali linux 2.0配置更新源后apt-get update 报错
  3. 消息称淘宝正测试微信支付 需要手动截图扫码支付
  4. Visual Studio Code 11 月 Python 扩展更新
  5. selenium2.0(WebDriver) API - 转载自:http://www.cnblogs.com/puresoul/p/3477918.html
  6. oracle中kill session的方法
  7. 「裸奔」的数据隐私!
  8. 编程常用资料/网站收集
  9. linux打补丁教程,Linux下patch打补丁命令
  10. PS人像磨皮——高低频修图法
  11. mysql左连接查询时多条件的注意事项
  12. QEMU,Dynamips,IOL区别
  13. Android音乐播放器
  14. CodeForces - 1526C2
  15. 42. 注入篇——Havij、Pangolin使用
  16. docker容器测试技巧
  17. 解决Unity物体速度过快无法进行碰撞检测(碰撞检测穿透)
  18. 13.计算机基础之多媒体技术与多媒体计算机系统
  19. xamarin Android 开发 文件“obj\Debug\android\bin\packaged_resources”不存在
  20. 2009年的人民币1000元购买力,相当于30年前人民币多少钱?

热门文章

  1. 20190923,两个月后的打球
  2. python——数理统计,概率
  3. 淘宝版本nginx使用纯干货
  4. 光遇自动弹琴脚本代码_光遇自动弹琴脚本下载,光遇自动弹琴脚本代码软件 v0.6.2-手游汇...
  5. feishu-飞书交互机器人开发
  6. 学习记录---8255A简介及使用方法
  7. KSM01.2B-061C-35N-M1-HP0-SE-NN伺服电机力士乐
  8. win7 、vistar、server2008 R2 、各种64位系统 安装局域网共享打印机,找不到驱动的问题
  9. rocketmq python 某个队列不消费_消息队列 RocketMQ 版消息轨迹没有显示消费信息,为什么?...
  10. Connectify中文版2013.03.28让wifi上网轻松又简单