groovy-集合

Lists

你能使用下面的方法创建一个lists,注意[]是一个空list。

1def list = [5678]
2assert list.get(2) == 7
3assert list[2] == 7
4assert list instanceof java.util.List
5 
6def emptyList = []
7assert emptyList.size() == 0
8emptyList.add(5)
9assert emptyList.size() == 1

每个列表表达式都是创建了 java.util.List的一个实例。

Ranges

Ranges容许你创建一个值序列,这个只序列可以被用作Lists,因为Range继承自Java.util.List.

Ranges 使用 ..来定义,并且包含两端的值

Ranges 也可以使用 ..< 来定义半开闭序列,这样创建的序列将包含最左边的,但是不包含最右边的:

1// an inclusive range
2def range = 5..8
3assert range.size() == 4
4assert range.get(2) == 7
5assert range[2] == 7
6assert range instanceof java.util.List
7assert range.contains(5)
8assert range.contains(8)
9 
10// lets use a half-open range
11range = 5..<8
12assert range.size() == 3
13assert range.get(2) == 7
14assert range[2] == 7
15assert range instanceof java.util.List
16assert range.contains(5)
17assert ! range.contains(8)
18 
19//get the end points of the range without using indexes
20def range = 1..10
21assert range.from == 1
22assert range.to == 10

Ranges适用于任何的实现了 java.lang.Comparable接口的Java对象,而且他也有next()和 previous() 方法来访问下一个和上一个元素。

比如你可以在Ranges中是用String:

1// an inclusive range
2def range = 'a'..'d'
3assert range.size() == 4
4assert range.get(2) == 'c'
5assert range[2] == 'c'
6assert range instanceof java.util.List
7assert range.contains('a')
8assert range.contains('d')
9assert ! range.contains('e')

Ranges可以和for循环结合起来说使用:

1for (i in 1..10) {
2 println "Hello ${i}"
3}

使用下面的代码也可以达到上述的效果:

1(1..10).each { i ->
2 println "Hello ${i}"
3}

Ranges当然也可以用在switch中:

1switch (years) {
2 case 1..10: interestRate = 0.076break;
3 case 11..25: interestRate = 0.052break;
4 default: interestRate = 0.037;
5}

Maps

注意 [:] 其实是一个空的Map。

Map的key如果是string的话,默认是这种形式: [a:1],它等价于["a":1]. 但是如果你真的想让一个变量作为key的话,那么你必须使用括号将他包起来: [(a):1].

1def map = [name:"Gromit", likes:"cheese", id:1234]
2assert map.get("name") == "Gromit"
3assert map.get("id") == 1234
4assert map["name"] == "Gromit"
5assert map['id'] == 1234
6assert map instanceof java.util.Map
7 
8def emptyMap = [:]
9assert emptyMap.size() == 0
10emptyMap.put("foo"5)
11assert emptyMap.size() == 1
12assert emptyMap.get("foo") == 5

Maps也有点想beans,这样就可以使用.号来获取属性:

1def map = [name:"Gromit", likes:"cheese", id:1234]
2assert map.name == "Gromit"
3assert map.id == 1234
4 
5def emptyMap = [:]
6assert emptyMap.size() == 0
7emptyMap.foo = 5
8assert emptyMap.size() == 1
9assert emptyMap.foo == 5

更有效的使用’*.’操作符

我们可以使用这个操作符来操作集合中的所有元素:

1assert [135] == ['a''few''words']*.size()

增强的集合方法:

比如下面的例子:

1def words = ['ant''buffalo''cat''dinosaur']
2assert words.findAll{ w -> w.size() > 4 } == ['buffalo''dinosaur']

下面的这个例子获取了所有元素的首字母:

1def words = ['ant''buffalo''cat''dinosaur']
2assert words.collect{ it[0] } == ['a''b''c''d']

切片操作符

1def text = "nice cheese gromit!"
2def x = text[2]
3 
4assert x == "c"
5assert x.class == String
6 
7def sub = text[5..10]
8assert sub == 'cheese'
9 
10def map = [name:"Gromit", likes:"cheese", id:1234]
11 
12assert map["name"] == "Gromit"
13assert map.name == "Gromit"
14 
15def list = [101112]
16def answer = list[2]
17assert answer == 12

下面再给出一些例子:

1def list = 100..200
2def sub = list[1320..2533]
3assert sub == [101103120121122123124125133]

也可以使用切片操作符来更新元素

1def list = ["a""b""c"]
2list[2] = "d"
3list[0] = list[1]
4list[3] = 5
5assert list == ["b""b""d"5]

我们可以使用负数来从尾部获取 List, array, String 等的值:

1def text = "nice cheese gromit!"
2def x = text[-1]
3assert x == "!"
4 
5def name = text[-7..-2]
6assert name == "gromit"

如果你使用一个向后的索引,也就是说前面的值比后面的大,比如[3:1],那么得到的结果是相反的:

1def text = "nice cheese gromit!"
2def name = text[3..1]
3assert name == "eci"

Dynamic objects (Expandos)

Expando 在严格意义上来说并不是一个集合。但是有点类似于Map, .他容许你充分理由Groovy’s closure mechanisms来创建动态对象, 但是 Expando和Map不同的是他可以提供 synthetic methods 。

1def player = new Expando()
2player.name = "Dierk"
3player.greeting = { "Hello, my name is $name" }
4 
5println player.greeting()
6player.name = "Jochen"
7println player.greeting()

The player.greeting assignment passes in a closure to execute when greeting() is called on the Expando. Notice that the closure has access to the properties assigned to the Expando, even though these values may change over time, using Groovy’s GString ”$variableOrProperty” notation.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值