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. 訪問列表的第一個元素(從零開始的計數)
  2. 使用負索引訪問列表的最後一個元素:-1是列表末尾的第一個元素
  3. 為列表的第三個元素設置新值
  4. 使用<<運算符將元素添加到列表的末尾
  5. 一次訪問兩個元素,返回包含這兩個元素的新列表
  6. 使用範圍來訪問列表中從開始到結束範圍元素的值

由於列表是可以有不同類型值的,因此列表還可以包含其他列表以創建多維列表:

def multi = [[0, 1], [2, 3]]    // 1  assert multi[1][0] == 2         // 2  
  1. 定義一個元素為列表的列表
  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  
  1. 使用顯式變數類型聲明定義字元串數組
  2. 斷言我們創建了一個字元串數組
  3. 使用as運算符創建一個整數數組
  4. 斷言我們創建了一個原始整數數組

您還可以創建多維數組:

def matrix3 = new Integer[3][3]         // 1  assert matrix3.size() == 3    Integer[][] matrix2                     // 2  matrix2 = [[1, 2], [3, 4]]  assert matrix2 instanceof Integer[][]  
  1. 您可以定義新數組的範圍
  2. 或者聲明一個數組而不指定大小

訪問數組元素的方式與列表相同:

String[] names = ['Cédric', 'Guillaume', 'Jochen', 'Paul']  assert names[0] == 'Cédric'     // 1    names[2] = 'Blackdrag'          // 2  assert names[2] == 'Blackdrag'  
  1. 獲取數組的第一個元素
  2. 將數組的第三個元素的值設置為新值

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  
  1. 我們定義了一個字元串顏色名稱的映射,並與它們的十六進位編碼的html顏色相關聯
  2. 我們使用下標符號來檢查與red鍵關聯的內容
  3. 我們還可以使用屬性符號來聲明綠色的十六進位表示形式
  4. 同樣,我們可以使用下標符號來添加新的鍵/值對
  5. 或使用屬性符號,添加黃色

當使用作為鍵的名稱時,我們實際上在映射中定義了字元串類型的鍵。

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  
  1. 與「Guillaume」名稱關聯的key實際上是「key」字元串,而不是與key變數關聯的值
  2. 映射不包含'name'
  3. 相反,映射包含一個'key'

您還可以傳遞帶引號的字元串作為鍵:["name":"Guillaume"]

如果您的鍵字元串不是有效的標識符,則這是強制性的,必須使用引號將其聲明為字元串。

例如,如果您想使用一個這樣的字元串鍵:["street-name":"Main street"]

當需要在映射定義中將變數值作為鍵傳遞時,必須用括弧將變數或表達式括起來:

person = [(key): 'Guillaume']        // 1    assert person.containsKey('name')    // 2  assert !person.containsKey('key')    // 3  
  1. 這次,我們用圓括弧將key變數括起來,以指示解析器傳遞變數而不是定義字元串鍵
  2. 該映射確實包含name
  3. 映射沒有像以前一樣包含key

查看本系列教程其他文章:

Groovy語法系列教程之注釋(一)

Groovy語法系列教程之關鍵字和標識符(二)

Groovy語法系列教程之字元串(三)

Groovy語法系列教程之數字(四)

Groovy語法系列教程之布爾(五)