Groovy基本語法

官方文檔html

註釋(Comments)

和Java同樣,支持單行(使用//)、多行(/* */)和文檔註釋(使用/** */)。java

Shebang line

UNIX系統支持一種特殊的單行註釋叫做Shebang line,用於指明腳本的運行環境,這樣就能夠直接在終端中使用./xxx.groovy運行(固然,前提是文件得有可運行的權限),而不用像groovy xxx.groovy這樣運行:正則表達式

#!/usr/bin/env groovy println "Hello from the shebang line" 

#號必須是文件的第一個字符。express

標識符(Identifiers)

普通標識符

以字母、美圓符號$或下劃線_開始,不能以數字開始。如下是可用的標識符:數組

def name def item3 def with_underscore def $dollarStart 

如下是不可用的標識符:閉包

def 3tier // 不能以數字開始 def a+b // "+"號是非法字符 def a#b // #號也不是可用的字符 

注意:在點號後,是可使用關鍵字做爲標識符的:ide

foo.as foo.assert foo.break foo.case foo.catch 

引號標識符(Quoted identifiers)

Groovy在點表達式(dotted expression)後面可使用引號標識符,好比persion.name能夠表示爲persion.'name'persion."name"。而引號中能夠包含普通標識符中不支持的字符,好比空格、中檔線-這些:ui

def map = [:] map."an identifier with a space and double quotes" = "ALLOWED" map.'with-dash-signs-and-single-quotes' = "ALLOWED" assert map."an identifier with a space and double quotes" == "ALLOWED" assert map.'with-dash-signs-and-single-quotes' == "ALLOWED" 

其實,Groovy支持多種字符串的字面量表達形式,這些都是能夠出如今點號後面的:lua

map.'single quote' map."double quote" map.'''triple single quote''' map."""triple double quote""" map./slashy string/ map.$/dollar slashy string/$ 

更方便的是,Groovy中的GString支持插值,也能夠用在點號後面的:spa

def firstname = "Homer" map."Simson-${firstname}" = "Homer Simson" // 會被插值成map."Simson-Homer" assert map.'Simson-Homer' == "Homer Simson" 

字符串

在Groovy中字符串有兩種類型,一種是Java原生的java.lang.String;另外一種是groovy.lang.GString,又叫插值字符串(interpolated strings)。

單引號字符串(Single quoted string)

在Groovy中,使用單引號括住的字符串就是java.lang.String,不支持插值:

def name = 'yjiyjgie' println name.class // class java.lang.String 

三單引號字符串(Triple single quoted string)

使用三單引號括住字符串支持多行,也是java.lang.String實例,在第一個’‘’起始處加一個反斜槓\能夠在新一行開始文本:

def strippedFirstNewline = '''line one line two line three ''' // 能夠寫成下面這種形式,可讀性更好 def strippedFirstNewline = '''\ line one line two line three ''' 

雙引號字符串(Double quoted string)

若是雙引號括住的字符串中沒有插值表達式(interpolated expression),那它就是java.lang.String;如是有插值表達式,那它就是groovy.lang.GString

def normalStr = "yjiyjige" // 這是一個java.lang.String def interpolatedStr = "my name is ${normalStr}" // 這是一個groovy.lang.GString 

字符串插值(String interpolation)

在Groovy全部的字符串字面量表示中,除了單引號字符串和三單引號字符串,其餘形式都支持字符串插值。字符串插值,也即將佔位表達式中的結果最終替換到字符串相應的位置中:

def name = 'Guillaume' // a plain string def greeting = "Hello ${name}" // name變量的值會被替換進去 assert greeting.toString() == 'Hello Guillaume' 

當使用點號表達式時,能夠只用$代替${}

def person = [name: 'Guillaume', age: 36] println "$person.name is $person.age years old" // 注意 def number = 3.14 println "$number.toString()" // 這裏會報異常,由於至關於"${number.toString}()" println "${number.toString()}" // 這樣就正常了 

插值佔位符中還支持閉包,而閉包的一個好處是惰性求值(lazy evaluation):

def number = 1 def eagerGString = "value == ${number}" // 普通形式 def lazyGString = "value == ${-> number}" // 這是一個閉包 println eagerGString == "value == 1" println lazyGString == "value == 1" number = 2 println eagerGString == "value == 1" // eagerGString已經被固定下來了 println lazyGString == "value == 2" // lazyGString的值會被從新計算 

當一個方法的須要一個java.lang.String變量,而咱們傳遞的是一個groovy.lang.GString實例時,GStringtoString方法會被自動調用,看起來像咱們能夠直接將一個GString賦值給一個String變量同樣。

注意:GStringString的hashCode是不同的,即便他們最終結果同樣。因此,在Map中,不該該用GString去作元素的Key,而又使用普通的String去取值:

def key = "a" def m = ["${key}": "letter ${key}"] // key類型是一個GString assert m["a"] == null // 用一個普通String類型的key去取值 

三雙引號字符串(Triple double quoted string)

相似於三單引號字符串,但支持字符串插值。

斜線字符串(Slashy string)

除了使用引號來括住字符串,還可使用/。它通常用來定義正則表達式:

def fooPattern = /.*foo.*/ assert fooPattern == '.*foo.*' def foo = /"yjiyjige"/ // 能夠在斜線表達式中,直接使用引號 println foo // 結果是「yjiyjige」 

美圓斜線字符串(Dollar slashy string)

這種字符串使用$/開始,使用/$結束,其中的轉義字符爲$

def name = "Guillaume" def date = "April, 1st" def dollarSlashy = $/ Hello $name, today we're ${date}. $ dollar sign $$ escaped dollar sign \ backslash / forward slash $/ escaped forward slash $/$ escaped dollar slashy string delimiter /$ assert [ 'Guillaume', 'April, 1st', '$ dollar sign', '$ escaped dollar sign', '\\ backslash', '/ forward slash', '$/ escaped forward slash', '/$ escaped dollar slashy string delimiter' ].each { dollarSlashy.contains(it) } 

字符串小結

 
 

字符(Characters)

在Groovy中並無明確的字符字面量表示形式,咱們必須明確指明:

char c1 = 'A' // 明確指定給一個字符變量 assert c1 instanceof Character def c2 = 'B' as char // 用as關鍵字 assert c2 instanceof Character def c3 = (char) 'C' // 強制類型轉換 assert c3 instanceof Character 

數字(Numbers)

當使用def指明整數字面量時,變量的類型會根據數字的大小自動調整:

def a = 1 assert a instanceof Integer // Integer.MAX_VALUE def b = 2147483647 assert b instanceof Integer // Integer.MAX_VALUE + 1 def c = 2147483648 assert c instanceof Long // Long.MAX_VALUE def d = 9223372036854775807 assert d instanceof Long // Long.MAX_VALUE + 1 def e = 9223372036854775808 assert e instanceof BigInteger 

爲了精確地計算小數,在Groovy中使用def聲明的小數是BigDecimal類型的:

def decimal = 123.456 println decimal.getClass() // class java.math.BigDecimal 

若是要強制指明一個數字的字面量類型,能夠給字面量加上類型後綴:

  • BigInteger 使用Gg
  • Long 使用Ll
  • Integer 使用Ii
  • BigDecimal 使用Gg
  • Double 使用Dd
  • Float 使用Ff

列表(List)

默認狀況下Groovy的列表使用的是java.util.ArrayList,用中括號[]括住,使用逗號分隔:

def numbers = [1, 2, 3] println numbers.getClass() // class java.util.ArrayList 

若是要使用其它類型的列表(如:LinkedList)可使用as操做符或顯式分配給一個指定類型的變量:

def arrayList = [1, 2, 3] // 默認類型 assert arrayList instanceof java.util.ArrayList def linkedList = [2, 3, 4] as LinkedList // 使用as操做符 assert linkedList instanceof java.util.LinkedList LinkedList otherLinked = [3, 4, 5] // 顯式指明類型 assert otherLinked instanceof java.util.LinkedList 

Groovy重載了列表的[]<<操做符,能夠經過List[index]訪問指定位置元素,也能夠經過List << element往列表末尾添加元素:

def letters = ['a', 'b', 'c', 'd'] assert letters[0] == 'a' assert letters[1] == 'b' assert letters[-1] == 'd' // 從後面訪問 assert letters[-2] == 'c' letters[2] = 'C' // 直接修改 assert letters[2] == 'C' letters << 'e' // 往最後面添加元素 assert letters[4] == 'e' assert letters[-1] == 'e' assert letters[1, 3] == ['b', 'd'] // 提取指定元素 assert letters[2..4] == ['C', 'd', 'e'] // 支持範圍(ranges)操做 // 二維列表 def multi = [[0, 1], [2, 3]] assert multi[1][0] == 2 

數組(Arrays)

在Groovy中,沒有數組的字面量定義方式。和特定類型列表的定義方式同樣,咱們須要使用as操做符或顯式地分配給一個數組類型的變量:

String[] arrStr = ['Ananas', 'Banana', 'Kiwi'] // 顯式指明類型 assert arrStr instanceof String[] assert !(arrStr instanceof List) def numArr = [1, 2, 3] as int[] // 使用as操做符 assert numArr instanceof int[] assert numArr.size() == 3 

映射(Maps)

Groovy使用中括號[]來定義映射,元素須要包含key和value使用冒號分隔,元素與元素之間用逗號分隔:

// key部分實際上是字符串 def colors = [red: '#FF0000', green: '#00FF00', blue: '#0000FF'] assert colors['red'] == '#FF0000' // 使用中括號訪問 assert colors.green == '#00FF00' // 使用點表達式訪問 colors['pink'] = '#FF00FF' colors.yellow = '#FFFF00' assert colors.pink == '#FF00FF' assert colors['yellow'] == '#FFFF00' assert colors instanceof java.util.LinkedHashMap // 默認使用LinkedHashMap類型 

在上邊的例子中,雖然沒有明確的使用字符串’red‘’green‘,但Groovy會自動把那些key轉化爲字符串。而且,在默認狀況下,初始化映射時,key也不會去使用已經存在的變量:

def keyVal = 'name' def persons = [keyVal: 'Guillaume'] // 此處的key是字符串keyVal而不是name assert !persons.containsKey('name') assert persons.containsKey('keyVal') 

若是要使用一個變量做爲key,須要用括號括住:

def keyVal = 'name' def persons = [(keyVal): 'Guillaume'] // 至關於[ 'name' : 'Guillaume' ] assert persons.containsKey('name') assert !persons.containsKey('keyVal')
相關文章
相關標籤/搜索