Groovy 1.8 新特性: Diamond operator 以及 DGM

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 本身的特性中找到。所以,除非你奋战在非常底层的代码中,否则我实在想不出这个钻石操作符有啥实际用途。

飞叔:唉,虽然被叫了十几年,昨天一自称飞哥还是被美女吐槽了。所以虽然目前还是很年轻,我依然决定还是自称飞叔

Hot smile

。怎么说八零后也得在九零、零零后面前摆摆姿态的

Ninja

。世界上最痛苦的事情莫过于等待,我等 JDK 7 已经等到呆了……可是在下载了预览版后,还是痛苦的发现并没有什么巨大的改进。2011 年好多东西要等,Diablo III 么我已经等了很多年了,从学 Groovy 前就开始等,等到现在依然在等;ChromeOS 号称在六月要出货了,但要等到一个适合我的版本不晓得还要多久。最痛苦的居然是等来等去还是没到 2012,世界居然还是存在的

Shifty

新的 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,'c')

注意,在这里,index 不可以取负数来试图从尾部插入元素。另外,字符串可以以列表的形式访问,但却无法以该形式使用 plus。

对 Set 和 Map 中的数字进行比较

现在开始,在 Set 和 Map 中,数字的比较将更有弹性,不同类型的数字如果值相同即视为相同。

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 为基础的分组算法就要方便多了。

Technorati Tags: Groovy 1.8 新特性

相关文章

背景:    8月29日,凌晨4点左右,某服务告警,其中一个...
https://support.smartbear.comeadyapi/docs/soapui/steps/g...
有几个选项可用于执行自定义JMeter脚本并扩展基线JMeter功能...
Scala和Java为静态语言,Groovy为动态语言Scala:函数式编程,...
出处:https://www.jianshu.com/p/ce6f8a1f66f4一、一些内部...
在运行groovy的junit方法时,报了这个错误:java.lang.Excep...