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

Technorati Tags: Groovy 1.8 新特性
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值