5. Groovy语法-List,Array,Maps学习

2022-12-07 18:22:31 浏览数 (1)

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方法外,还可以直接使用方括号,示例如下:

代码语言:javascript复制
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方法外,还有<<标识符进行添加。示例如下:

代码语言:javascript复制
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中charString的创建一样。)

我们默认的时候创建的就是List对象,而我们如果要创建Array数组对象,就不能使用def而要声明式创建:

代码语言:javascript复制
 String[] arrStr = ['zin', 'yan', 'com']  //例如我们创建了一个字符串数组

如果很喜欢def创建的话,我们也可以使用as关键字进行标注转换。示例如下:

代码语言:javascript复制
def arrStr = ['zin', 'yan', 'com'] as String[]  //创建一个字符串数组
def numArr = [1, 2, 3] as int[]  //创建一个int数组

如果我们也不想使用as字段。还可以使用声明式创建:

代码语言:javascript复制
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数组初始化表达式的这种变体。也就是说支持以下的创建方式:

注意了,必须Groovy 3.0 以上才支持。否则会在运行时出现错误。

代码语言:javascript复制
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 运算符相关知识。

0 人点赞