Diamond Operator
Groovy 作为 jvm 世界的皇储,自然和 Java 的关系非同一般。对于即将揭开面纱的 JDK 7 而言,Groovy 将在 1.9 版本中提供语言级别的对应。但是,有一个 JDK 7 的新特性在 Groovy 1.8 版本就提前实现了,那就是 Diamond Operator:
1: // old school:
2: List> list2 = new ArrayList<>()
3: // Diamond operator:
4: List> list2 = new ArrayList<>()
嗯,怎么说呢。我想除非是用 Groovy++,否则在 Groovy 代码中,这个操作的意义并不是很大。连同其它 JDK 7 的新特性也是,比如 strings in switch 之类,都可以在 Groovy 本身的特性中找到。所以,除非你奋战在非常底层的代码中,否则我实在想不出这个钻石操作符有啥实际用途。
飞叔:唉,虽然被叫了十几年,昨天一自称飞哥还是被美女吐槽了。所以虽然目前还是很年轻,我依然决定还是自称飞叔。怎么说八零后也得在九零、零零后面前摆摆姿态的。世界上最痛苦的事情莫过于等待,我等 JDK 7 已经等到呆了……可是在下载了预览版后,还是痛苦的发现并没有什么巨大的改进。2011 年好多东西要等,Diablo III 么我已经等了很多年了,从学 Groovy 前就开始等,等到现在依然在等;ChromeOS 号称在六月要出货了,但要等到一个适合我的版本不晓得还要多久。最痛苦的居然是等来等去还是没到 2012,世界居然还是存在的。
新的 DGM 方法
DGM,也就是 DefaultGroovyMethods,是利用 Groovy 的元编程能力注入到普通类中的方法。
在 count 中使用闭包
以前需要先 findAll 再进行size 计算的过程,现在可以用带有闭包的 count 完成:
1: // 0到99间奇数的数量
2: assert (0..99).count { it % 2 } == 50
分组计数:countBy
该方法会将 collection 中的成员代入闭包,并根据闭包返回值进行分组,输出每组的计数
1: assert (1..99).countBy { it % 2 } == [0: 49, 1:50]
将元素插入 collection 的指定位置
1: assert [1, 'a', 'b', 'c', 2] == [1, 2].plus(1, 'a', 'b', 'c')
注意,在这里,index 不可以取负数来试图从尾部插入元素。另外,字符串可以以列表的形式访问,但却无法以该形式使用 plus。
对 Set 和 Map 中的数字进行比较
现在开始,在 Set 和 Map 中,数字的比较将更有弹性,不同类型的数字如果值相同即视为相同。
1: assert [1, 2] as Set == [1L, 2.0] as Set
2: assert [a: 1] == [a: 1L]
toSet 方法
可以通过 toSet 将数组(仅支持原生型别)、字符串和集合转变为 Set
1: assert [2, 1, 2].toSet() == ([1, 2, 1] as int[]).toSet()
2: assert 'live dog'.toSet() == 'evil god'.toSet()
Map 的 min/max 闭包方法
1: map = [a: 1, bbb: 2, cc: 3, dddd: 2]
2: assert map.max { it.key.size() }.key == 'dddd'
3: assert map.min { it.value }.value == 1
该方法也被补充到了最近的 1.7 版本
Map 的 withDefault 方法
1: pets = [:].withDefault { 'cat' }
2: assert pets.best == 'cat'
3:
4: names = [:].withDefault { it.toUpperCase() }
5: assert 'HIARCS' == names.hiarcs
飞叔:withDefault 方法是以上这些 DGMs 中最令我兴奋的一点,利用这个方法,可以节约大量的 map 内容初始化代码,以后做起以 Map 为基础的分组算法就要方便多了。