Groovy語法系列教程之集合(六)【完結】
- 2020 年 3 月 10 日
- 筆記
Groovy語法概述
本系列教程介紹Groovy程式語言的語法。Groovy的語法源自Java語法,但是通過特定類型對其進行了增強,並允許進行某些簡化。
Groovy集合包括列表(Lists)、數組(Arrays)、映射(Maps)三種類型。
7. 列表
Groovy使用逗號分隔的值列表(用方括弧括起來)表示列表。
Groovy列表是JDK原生的java.util.List
,Groovy並未定義自己的集合類。
定義列表文字時使用的具體列表實現默認情況下為java.util.ArrayList
,除非您決定另行指定,我們在後面也很介紹。
def numbers = [1, 2, 3] assert numbers instanceof List assert numbers.size() == 3
- 我們定義一個列表號,以逗號分隔並用方括弧括起來,然後將該列表分配給變數
- 該列表是Java的
java.util.List
介面的一個實例 - 列表的大小可以使用
size()
方法查詢,我們的列表包含3個元素
在上面的示例中,我們使用了同類型列表,但您也可以創建包含不同類型值的列表:
def heterogeneous = [1, "a", true]
這個列表包含一個數字,一個字元串和一個布爾值。
我們提到過,默認情況下,列表文字實際上是java.util.ArrayList
的實例。
但是也可以通過as
運算符使用類型強制,或者對變數使用顯式類型聲明,來為列表使用不同的後端類型:
def arrayList = [1, 2, 3] assert arrayList instanceof java.util.ArrayList def linkedList = [2, 3, 4] as LinkedList assert linkedList instanceof java.util.LinkedList LinkedList otherLinked = [3, 4, 5] assert otherLinked instanceof java.util.LinkedList
- 通過
as
運算符使用類型強制列表為java.util.LinkedList
類型 - 對變數使用顯式類型聲明,聲明為
java.util.LinkedList
類型
您可以使用帶有正索引或負索引的[]
下標運算符(用於讀取和設置值)訪問列表的元素,以正序或逆序訪問元素,也使用<<
運算符將元素追加到列表:
def letters = ['a', 'b', 'c', 'd'] assert letters[0] == 'a' // 1 assert letters[1] == 'b' assert letters[-1] == 'd' // 2 assert letters[-2] == 'c' letters[2] = 'C' assert letters[2] == 'C' // 3 letters << 'e' // 4 assert letters[4] == 'e' assert letters[-1] == 'e' assert letters[1, 3] == ['b', 'd'] // 5 assert letters[2..4] == ['C', 'd', 'e'] // 6
- 訪問列表的第一個元素(從零開始的計數)
- 使用負索引訪問列表的最後一個元素:-1是列表末尾的第一個元素
- 為列表的第三個元素設置新值
- 使用
<<
運算符將元素添加到列表的末尾 - 一次訪問兩個元素,返回包含這兩個元素的新列表
- 使用範圍來訪問列表中從開始到結束範圍元素的值
由於列表是可以有不同類型值的,因此列表還可以包含其他列表以創建多維列表:
def multi = [[0, 1], [2, 3]] // 1 assert multi[1][0] == 2 // 2
- 定義一個元素為列表的列表
- 訪問第二個列表元素的第一個元素
8. 數組
Groovy數組復用了列表的符號,要製作特定類型數組,您需要通過強制類型轉換或類型聲明顯式定義數組的類型。
String[] arrStr = ['Ananas', 'Banana', 'Kiwi'] // 1 assert arrStr instanceof String[] // 2 assert !(arrStr instanceof List) def numArr = [1, 2, 3] as int[] // 3 assert numArr instanceof int[] // 4 assert numArr.size() == 3
- 使用顯式變數類型聲明定義字元串數組
- 斷言我們創建了一個字元串數組
- 使用
as
運算符創建一個整數數組 - 斷言我們創建了一個原始整數數組
您還可以創建多維數組:
def matrix3 = new Integer[3][3] // 1 assert matrix3.size() == 3 Integer[][] matrix2 // 2 matrix2 = [[1, 2], [3, 4]] assert matrix2 instanceof Integer[][]
- 您可以定義新數組的範圍
- 或者聲明一個數組而不指定大小
訪問數組元素的方式與列表相同:
String[] names = ['Cédric', 'Guillaume', 'Jochen', 'Paul'] assert names[0] == 'Cédric' // 1 names[2] = 'Blackdrag' // 2 assert names[2] == 'Blackdrag'
- 獲取數組的第一個元素
- 將數組的第三個元素的值設置為新值
Groovy不支援Java數組初始化表示法,因為大括弧與Groovy閉包表示法有衝突。
下面是Java數組初始化的語句示例:
int a[] = {2, 0, 1, 9, 2020};
9. 映射
有時在其他語言中稱為字典或關聯數組,Groovy支援映射功能。
映射將鍵與值相關聯,鍵和值之間用冒號分隔,將每個鍵/值對之間用逗號分隔,並將整個鍵和值括在方括弧中。
def colors = [red: '#FF0000', green: '#00FF00', blue: '#0000FF'] // 1 assert colors['red'] == '#FF0000' // 2 assert colors.green == '#00FF00' // 3 colors['pink'] = '#FF00FF' // 4 colors.yellow = '#FFFF00' // 5 assert colors.pink == '#FF00FF' assert colors['yellow'] == '#FFFF00' assert colors instanceof java.util.LinkedHashMap
- 我們定義了一個字元串顏色名稱的映射,並與它們的十六進位編碼的html顏色相關聯
- 我們使用下標符號來檢查與
red
鍵關聯的內容 - 我們還可以使用屬性符號來聲明綠色的十六進位表示形式
- 同樣,我們可以使用下標符號來添加新的鍵/值對
- 或使用屬性符號,添加黃色
當使用作為鍵的名稱時,我們實際上在映射中定義了字元串類型的鍵。
Groovy創建的映射實際上是java.util.LinkedHashMap
的實例。
如果您嘗試訪問映射中不存在的鍵,將返回null
值:
ssert colors.unknown == null
在上面的示例中,我們使用了字元串類型的鍵,但是您也可以將其他類型的值用作鍵:
def numbers = [1: 'one', 2: 'two'] assert numbers[1] == 'one'
在這裡,我們使用數字作為鍵,因為數字可以明確地識別為數字,因此Groovy不會像前面的示例那樣創建字元串類型的鍵。
但請考慮以下情況:您要傳遞變數來代替鍵,以使該變數的值成為鍵:
def key = 'name' def person = [key: 'Guillaume'] // 1 assert !person.containsKey('name') // 2 assert person.containsKey('key') // 3
- 與「Guillaume」名稱關聯的
key
實際上是「key」
字元串,而不是與key
變數關聯的值 - 映射不包含
'name'
鍵 - 相反,映射包含一個
'key'
鍵
您還可以傳遞帶引號的字元串作為鍵:["name":"Guillaume"]
。
如果您的鍵字元串不是有效的標識符,則這是強制性的,必須使用引號將其聲明為字元串。
例如,如果您想使用一個這樣的字元串鍵:["street-name":"Main street"]
。
當需要在映射定義中將變數值作為鍵傳遞時,必須用括弧將變數或表達式括起來:
person = [(key): 'Guillaume'] // 1 assert person.containsKey('name') // 2 assert !person.containsKey('key') // 3
- 這次,我們用圓括弧將
key
變數括起來,以指示解析器傳遞變數而不是定義字元串鍵 - 該映射確實包含
name
鍵 - 映射沒有像以前一樣包含
key
鍵
查看本系列教程其他文章: