Groovy学习之-Groovy Development Kit(GDK)-实用工具

Groovy学习目录-传送门

ConfigSlurper

ConfigSlurper是一个用于读取以Groovy脚本形式定义的配置文件的实用程序类。 类似于Java * .properties文件的情况,ConfigSlurper允许使用点符号。 但此外,它允许Closure作用域配置值和任意对象类型。

def config = new ConfigSlurper().parse('''
    app.date = new Date()  //点符号的用法
    app.age  = 42
    app {                  //使用Closure作用域作为点符号的替代
        name = "Test${42}"
    }
''')

assert config.app.date instanceof Date
assert config.app.age == 42
assert config.app.name == 'Test42'

从上面的例子可以看出,parse方法可以用来检索groovy.util.ConfigObject实例。ConfigObject是一个专门的java.util.Map实现,它返回配置的值或一个新的ConfigObject实例,但永远不为null

def config = new ConfigSlurper().parse('''
    app.date = new Date()
    app.age  = 42
    app.name = "Test${42}"
''')

assert config.test != null//`config.test`还没有被指定,它被调用时返回一个`ConfigObject`。

点符号是配置变量名称的一部分的情况下,可以使用单引号或双引号对其进行转义。

def config = new ConfigSlurper().parse('''
    app."person.age"  = 42
''')

assert config.app."person.age" == 42

此外,ConfigSlurper还支持environmentsenvironments方法可以用来移交一个本身可能由几个部分组成的Closure实例。 假设我们想为开发环境创建一个特定的配置值。 当创建ConfigSlurper实例时,我们可以使用ConfigSlurper(String)构造函数来指定目标环境。

def config = new ConfigSlurper('development').parse('''
  environments {
       development {
           app.port = 8080
       }

       test {
           app.port = 8082
       }

       production {
           app.port = 80
       }
  }
''')

assert config.app.port == 8080

ConfigSlurper环境不限于任何特定的环境名称。 它只依赖于ConfigSlurper客户端代码支持和解释什么值。

environments方法是内置的,但registerConditionalBlock方法可用于注册除environments名称之外的其他方法名称。

def slurper = new ConfigSlurper()
slurper.registerConditionalBlock('myProject', 'developers')   //一旦新block被注册,ConfigSlurper可以解析它。

def config = slurper.parse('''
  sendMail = true

  myProject {
       developers {
           sendMail = false
       }
  }
''')

assert !config.sendMail

对于Java集成,toProperties方法可用于将ConfigObject转换为可能存储到* .properties文本文件的java.util.Properties对象。 请注意,将配置值添加到新创建的Properties实例时,将其转换为String实例。

def config = new ConfigSlurper().parse('''
    app.date = new Date()
    app.age  = 42
    app {
        name = "Test${42}"
    }
''')

def properties = config.toProperties()

assert properties."app.date" instanceof String
assert properties."app.age" == '42'
assert properties."app.name" == 'Test42'

Expando

Expando类可用于创建动态可扩展对象。 尽管它的名称叫Expando,它不使用类ExpandoMetaClass。 每个Expando对象表示一个独立的动态制作的实例,可以在运行时使用属性(或方法)进行扩展。

def expando = new Expando()
expando.name = 'John'

assert expando.name == 'John'

当动态属性注册Closure代码块时,会发生特殊情况。 一旦Closure被注册,它就可以被调用,因为它将通过方法调用完成。

def expando = new Expando()
expando.toString = { -> 'John' }
expando.say = { String s -> "John says: ${s}" }

assert expando as String == 'John'
assert expando.say('Hi') == 'John says: Hi'

可观察的 list, map and set

Groovy带有可观察的 list, map and set。 当添加,删除或更改元素时,每个集合都会触发java.beans.PropertyChangeEvent事件。 注意,PropertyChangeEvent不仅发出某个事件已经发生的信号,此外,它保存关于属性名称和某个属性已经改变到的旧/新值的信息。

根据发生的更改的类型,可观察的集合可能触发更专门的PropertyChangeEvent类型。 例如,向可观察列表中添加元素会触发ObservableList.ElementAddedEvent事件。

def event                                       //声明一个PropertyChangeEventListener捕获被触发的事件
def listener = {
    if (it instanceof ObservableList.ElementEvent)  {  //ObservableList.ElementEvent及其子类型与此侦听器相关
        event = it
    }
} as PropertyChangeListener


def observable = [1, 2, 3] as ObservableList    //注册监听器
observable.addPropertyChangeListener(listener)  //从给定列表创建一个ObservableList

observable.add 42                               //触发ObservableList.ElementAddedEvent事件

assert event instanceof ObservableList.ElementAddedEvent

def elementAddedEvent = event as ObservableList.ElementAddedEvent
assert elementAddedEvent.changeType == ObservableList.ChangeType.ADDED
assert elementAddedEvent.index == 3
assert elementAddedEvent.oldValue == null
assert elementAddedEvent.newValue == 42

请注意,添加元素实际上会触发两个事件。 第一个是类型 ObservableList.ElementAddedEvent,第二个是一个普通的PropertyChangeEvent,通知监听器属性size的更改。

ObservableList.ElementClearedEvent事件类型是另一个有趣的事件类型。 每当删除多个元素时,例如调用clear()时,它保存从列表中删除的元素。

def event
def listener = {
    if (it instanceof ObservableList.ElementEvent)  {
        event = it
    }
} as PropertyChangeListener


def observable = [1, 2, 3] as ObservableList
observable.addPropertyChangeListener(listener)

observable.clear()

assert event instanceof ObservableList.ElementClearedEvent

def elementClearedEvent = event as ObservableList.ElementClearedEvent
assert elementClearedEvent.values == [1, 2, 3]
assert observable.size() == 0

为了获得所有支持的事件类型的概述,我们鼓励读者查看JavaDoc文档或正在使用的observable集合的源代码。

ObservableMapObservableSet带有我们在本节中对ObservableList所看到的相同的概念。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,656评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,810评论 6 342
  • 导语: 随着技术的发展,不管是前端开发、服务端开发或者是移动端开发(移动也是前端的一个分支)中都会用到自动化构建工...
    伊始雨深阅读 3,028评论 0 4
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,631评论 18 399
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,520评论 0 4