1. 介绍
本篇为Groovy学习第五篇,学习Groovy语法中的集合,数组和Map数据结构。
到这篇为止,有关于Groovy的基本语法知识就学习完毕了。下面,让我们进入正文。
2. Lists
Groovy使用逗号分隔值列表,用方括号包围来表示列表。Groovy列表是普通的JDK java.util.list
,因为Groovy没有定义自己的集合类。默认情况下,定义列表字面量时使用的具体列表实现是java.util.ArrayList
,除非我们在创建对象时强制指定。
示例代码:
代码语言:javascript复制def numbers = [1, 2, 3] //我创建了一个int 集合对象
int size = numbers.size() //可以获取集合的数量
def i = numbers.get(1) //可以获取下标位1的集合参数
除此外,我们可以多种数据混杂:
代码语言:javascript复制def heterogeneous = [1, "a", true] //创建了一个包含了数字,字符串,boolean 的集合
默认情况下,列表实际上是java.util.ArrayList
的实例,但我们也可以通过as关键字,将集合类型进行转换操作。
例如下面示例:
代码语言:javascript复制def arrayList = [1, 2, 3] // 这个对象是ArrayList
def linkedList = [2, 3, 4] as LinkedList //这个对象是LinkedList
LinkedList otherLinked = [3, 4, 5] //这个对象是LinkedList
我们可以通过as
关键字转换,同时也可以放弃def
动态变量,而直接表明数据类型。
添加数据和获取数据除了使用get
方法外,还可以直接使用方括号,示例如下:
class Zinyan {
def static main(def args) {
def numbers = [1, 2, 3]
//如果从左到右计算,那么下标值从0开始
println(numbers.get(1)) //输出结果为2
println(numbers[0]) // 输出结果为 1
//我们如果想获取最后一位item,也就是从右往左计算
println(numbers[-1]) //可以用负数表示 。输出结果为3
println(numbers[-2]) //输出结果为2
}
}
其次,还支持获取集合某指定坐标范围内的值,示例如下:
代码语言:javascript复制class Zinyan {
def static main(def args) {
def numbers = [1, 2, 3,4,5,6]
//获取集合中下标 2,和4的值
println(numbers[2,4]) //返回[3, 5]
//获取集合中下标1到4的值
println(numbers[1..4]) //返回 [2, 3, 4, 5]
}
}
我们如果想往集合中添加数据,除了add
方法外,还有<<
标识符进行添加。示例如下:
class Zinyan {
def static main(def args) {
def zin = ["z","i","n"]
//例如往集合中,添加 yan字符
zin.add("y") //方法一
zin.add("a")
zin << "n" //方法二
println(zin) //将会输出:[z, i, n, y, a, n]
}
}
请注意:不能使用>>
进行添加数据哦。会出现groovy.lang.MissingMethodException: No signature of method: java.util.ArrayList.rightShift() is applicable for argument types: (String) values: [n]
错误。
如果是多维数组,那么可以通过方括号进行简单的扩展即可了:
代码语言:javascript复制class Zinyan {
def static main(def args) {
def multi = [['z', 'i',
'n'], ['y', 'a','n']]
print(multi[0]) //打印 [z, i, n]
print(multi[0][1])//打印 i
print(multi[1])//打印 [y, a, n]
print(multi[1][-2]) //打印 a
}
}
总的来说,我们可以直接按照java的集合的写法进行创建,同时也可以使用Groovy支持的快捷方式创建和维护集合。
(PS:这种效果在现在的高级语言中几乎都支持这种写法了,例如kotlin等)
3. Arrays
Groovy重用数组的列表表示法,但是要使这些数组,您需要通过强制或类型声明显式地定义数组的类型。
什么意思呢?在java中数组才是用[]
表示的。而Groovy默认将这个数组表示法用在了集合List的创建上了。(PS:就如同在Groovy中char
和String
的创建一样。)
我们默认的时候创建的就是List
对象,而我们如果要创建Array
数组对象,就不能使用def
而要声明式创建:
String[] arrStr = ['zin', 'yan', 'com'] //例如我们创建了一个字符串数组
如果很喜欢def
创建的话,我们也可以使用as
关键字进行标注转换。示例如下:
def arrStr = ['zin', 'yan', 'com'] as String[] //创建一个字符串数组
def numArr = [1, 2, 3] as int[] //创建一个int数组
如果我们也不想使用as
字段。还可以使用声明式创建:
def arrStr = new String[3]
print(arrStr) //将会输出 [null, null, null]
数组值为空。所以输出为null。
如果要创建多维数组,和集合的多维创建方式差不多。示例如下:
代码语言:javascript复制class Zinyan {
def static main(def args) {
def matrix3 = new Integer[3][3] //创建一个3*3的int型数组对象,数组为空
println(matrix3) // 输出:[[null, null, null], [null, null, null], [null, null, null]]
Integer[][] matrix2 = [[1, 2], [3, 4]] //创建一个2*2 int型数组对象,同时给数组进行了赋值
println(matrix2) //输出:[[1, 2], [3, 4]]
}
}
我们如果要获取数组的参数和修改参数:
代码语言:javascript复制 def static main(def args) {
String[] arrStr = ['zin', 'yan', 'com']
println(arrStr) //输出 [zin, yan, com]
println(arrStr[0]) //输出 zin
println(arrStr[-1]) //输出 com
//arrStr<<"z同学" // 数组不能进行添加操作了。
arrStr[-1] ="z同学" //可以通过该方法修改
println(arrStr) //输出 [zin, yan, z同学]
}
读取的逻辑和List是一样的。
Groovy一直支持使用方括号的列表/数组
定义,并避免使用java风格的花括号,以免与闭包定义冲突。然而,在花括号紧接在数组类型声明之后的情况下,闭包定义没有歧义,因此Groovy 3及以上版本支持Java数组初始化表达式的这种变体。也就是说支持以下的创建方式:
代码语言:javascript复制注意了,必须Groovy 3.0 以上才支持。否则会在运行时出现错误。
class Zinyan {
def static main(def args) {
def primes = new int[] {2, 3, 5, 7, 11}
println(primes.size()) // 输出5
println(primes.sum()) //输出 28
def pets = new String[] {'zin', 'yan'}
println(pets.sum()) //输出 zinyan
String[] groovyBooks = [ 'Groovy in Action', 'Making Java Groovy' ]
groovyBooks.every{
println(it) //输出 Groovy in Action
}
}
}
不建议采用花括号方式创建数组,很容易造成不兼容或者识别错误。Groovy也本身不推荐这样的写法。
4. Maps
Map的数据格式常见为键值对形式展现。在Groovy中map创建也是使用方括号进行创建,前面为键后面为值。示例如下:
代码语言:javascript复制//默认的数据格式为LinkedHashMap对象
def colors = [red: '#FF0000', green: '#00FF00', blue: '#0000FF']
不建议在键的地方使用中文或者其他符号。获取和修改键值对的方法为:
代码语言:javascript复制 def static main(def args) {
//默认的数据格式为LinkedHashMap对象
def colors = [red: '#FF0000', green: '#00FF00', blue: '#0000FF']
println(colors.blue) //方案一 输出 #0000FF
println(colors['blue']) //方案二 输出 #0000FF
//同时也可以使用上面的方法进行修改
colors.red='#FF00FF'
println(colors.red) //输出 #FF00FF
colors['red'] ='#FFFF' //
println(colors.red) //输出 #FFFF
println(colors) //输出 [red:#FFFF, green:#00FF00, blue:#0000FF]
println(colors.keySet()) //输出全部key值 输出 [red, green, blue]
println(colors.values()) //输出全部的values值, 输出[#FFFF, #00FF00, #0000FF]
}
如果我们访问问映射中不存在的键:
代码语言:javascript复制class Zinyan {
def static main(def args) {
//默认的数据格式为LinkedHashMap对象
def colors = [:]
println(colors.anyKey) //输出null
}
}
我们可以通过anyKey进行检测是否存在。
我们如果创建的key是int 那么我们在方括号中就不要添加单引号了:
代码语言:javascript复制def numbers = [1: 'one', 2: 'two']
println(numbers[2]) //输出 two
除此之外,我们还可以使用变量当做Key值。示例如下:
代码语言:javascript复制class Zinyan {
def static main(def args) {
//默认的数据格式为LinkedHashMap对象
def key='name'
def person = [(key): 'zinyan']
println(person) //输出[name:zinyan]
def person1 = [key: 'zinyan']
println(person1) //输出[key:zinyan]
}
}
我们如果使用变量当做key值传入。那么必须通过括号包裹起来,告诉Groovy这个key值是个变量。
如果直接写,那么就会将该key值识别为字符串了。
5. 小结
以上内容知识,大家可以通过Groovy官方文档进行查询:http://docs.groovy-lang.org/docs/groovy-4.0.6/html/documentation/#_lists 。
上面其实主要讲了Groovy中List,Array,Map 有别于Java中的一些特殊写法。如果你对于Java中的集合数组等概念不太明白的话,可能直接阅读会有歧义和不明白的地方。
如果上面的写法不适应的话,我们也可以直接按照java中的创建方式进行创建。
整个文档,比较适合有一定开发经验的人阅读和了解。
到这里Groovy官方文档中关于语法的相关介绍就结束了。下一章开始学习 Operators 运算符相关知识。