Lists

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

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

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

Ranges

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

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

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

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

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

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

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

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

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

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

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

Ranges当然也可以用在switch中:

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

Maps

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

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

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

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

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

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

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

1 assert [1, 3, 5] == ['a', 'few', 'words']*.size()

增强的集合方法:

比如下面的例子:

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

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

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

切片操作符

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

下面再给出一些例子:

1 def list = 100..200
2 def sub = list[1, 3, 20..25, 33]
3 assert sub == [101, 103, 120, 121, 122, 123, 124, 125, 133]

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

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

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

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

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

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

Dynamic objects (Expandos)

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

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

groovy-集合的更多相关文章

  1. groovy集合

    groovy集合可以直接在语言中使用,因为它默认已经导入包了. 不需要初始化对象,也不需要专门的类. 集合是groovy语言本地成员.Groovy语法提供了本地列表和相应的映射. 每个Groovy集合 ...

  2. Groovy系列(4)- Groovy集合操作

    Groovy集合操作 Lists List 字面值 您可以按如下所示创建列表. 请注意,[]是空列表表达式 def list = [5, 6, 7, 8] assert list.get(2) == ...

  3. 新学习的语言Groovy

    什么是 Groovy? Groovy 是 JVM 的一个替代语言 —替代 是指可以用 Groovy 在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同.在编写新应用 ...

  4. 学点Groovy来理解build.gradle代码

    在写这篇博客时,搜索参考了很多资料,网上对于 Groovy 介绍的博客已经特别多了,所以也就没准备再详细的去介绍 Groovy,本来也就计划写一些自己认为较重要的点.后来发现了 Groovy 的官方文 ...

  5. [转载] 详述三种现代JVM语言--Groovy,Scala和Clojure

    转载自http://www.tuicool.com/articles/jYzuAv和http://www.importnew.com/1537.html 在我与Martin Fowler曾经合作呈现的 ...

  6. android build.gradle(groovy)

    一.build.Gradle 这个 build.Gradle 文件来自 drakeet 大神的 Meizi 项目我直接在代码上加注释,参照着注释看代码就行,是不是发现有很多代码平时都没看见过. //M ...

  7. rest-assured之静态导入及简单使用实例

    一.静态导入 为了有效的使用rest-assured,官网推荐从下列class中静态导入方法: io.restassured.RestAssured.* io.restassured.matcher. ...

  8. 接口测试 rest-assured 使用指南

    转自:https://testerhome.com/topics/7060 原文:https://github.com/rest-assured/rest-assured/wiki/Usage本文gi ...

  9. rest-assured-doc接口自动化测试,数据驱动测试平台

    原文:https://github.com/rest-assured/rest-assured/wiki/Usage 本文github地址:https://github.com/RookieTeste ...

  10. Groovy 读取json文件,并用gson反序列化为List集合

    Groovy 读取json文件,并用gson反序列化 package com.bicycle.util import bicycle_grails.StationInfo import com.goo ...

随机推荐

  1. java9-1.类,抽象类,接口的综合小练习

    /* 教练和运动员案例(学生分析然后讲解) 乒乓球运动员和篮球运动员. 乒乓球教练和篮球教练. 为了出国交流,跟乒乓球相关的人员都需要学习英语. 请用所学知识: 分析,这个案例中有哪些抽象类,哪些接口 ...

  2. ios开发中如何隐藏各种bar

    转载自http://www.cnblogs.com/lovecode/articles/2234557.html 状态条Status Bar [UIApplication sharedApplicat ...

  3. ie6,ie7兼容性总结(转)

    其实浏览器的不兼容,我们往往是各个浏览器对于一些标准的定义不一致导致的,因此,我们可以进行一些初始化,很多问题都很轻松解决. 下面是14条特殊情况仅供参考: 1. 文字本身的大小不兼容.同样是font ...

  4. 【MFC】无边框窗体 WS_THICKFRAME

    1.没有WS_THICKFRAME,有WS_SYSMENU,就没办法通过相应WM_NCHITTEST,去处理窗口的缩放.2.没有WS_THICKFRAME,也没有WS_SYSMEN,在xp系统下任务栏 ...

  5. 【转】【C#】C#性能优化总结

    1.  C#语言方面         1.1 垃圾回收    垃圾回收解放了手工管理对象的工作,提高了程序的健壮性,但副作用就是程序代码可能对于对象创建变得随意.    1.1.1 避免不必要的对象创 ...

  6. linux输入输出重定向

    http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html 在Linux下,当一个用户进程被创建的时候,系统会自动为该进程创建三个数据 ...

  7. C语言 读取文件中特定数据

    //读取文件数据 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> struct jia ...

  8. JavaScript及其异步实现续:Promise让一切更简单

    在写这篇文章之前,我参考了以下文章.所以我文中的例子都是精准的,而且有循可依.下面抛出例子的链接: Understanding JQuery.Deferred and Promise Deferred ...

  9. Self Organizing Maps (SOM): 一种基于神经网络的聚类算法

    自组织映射神经网络, 即Self Organizing Maps (SOM), 可以对数据进行无监督学习聚类.它的思想很简单,本质上是一种只有输入层--隐藏层的神经网络.隐藏层中的一个节点代表一个需要 ...

  10. GDB代码调试与使用

    GDB代码调试与使用 Linux下GDB调试代码 源代码 编译生成执行文件 gcc -g test.c -o test 使用GDB调试 启动GDB:gdb test 从第一行列出源代码:list 直接 ...