Gradle for JAVA — Groovy
前一篇文章「Gradle for JAVA — init」建立了基本的gradle java專案,並且了解gradle 運作方式,而且gradle 我們使用Groovy語法,因此這篇文章主要在講Groovy語法。
在學習Groovy之前先安裝ide,因為是用在java,所以選擇java的ide — Spring Tool Suite。
安裝好了之後安裝可以編輯Groovy的plugin。
重啟之後File>New>Other>Groovy 就可以新增Groovy
Create Groovy Poject
File>New>Project>Groovy Project
Name:GroovyDemo
src 資料夾底下建立Groovy檔案
New > Other > Groovy > Groovy Type
Package:com.groovy.demo
Kind:Script
Name:first
程式碼:
package com.groovy.demoprintln("Groovy is awesome")
執行:
Data Types
宣告變數
def a = 10
取得變數的type
a.class
println a// 輸出
// class java.lang.Integer
宣告變數的型別
float a = 10.24F
直接宣告變數
s = 'hello'
println s// 輸出
// class java.lang.String
「”
」雙引號和「’
」單引號的差異,雙引號可以使用「${}」placeholders。
s2 = "${s} summer"println s2// 輸出
// hello summer
宣告String multiple line,使用「’’’
」。
s='''
line1
line2
line3
'''
Regular expression Type,使用「==~
」來驗證,epattern 的type 為string。
epattern = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z]+$/print "test@gmail.com" ==~ epattern
Closures 閉包
類似於Java中的lambda
c = {
println("Closures are super simple")
}c.call()
傳遞參數「參數名稱->」。這個範例還使用了Elvis Operator 「?:
」
c = { n->
println(n%2==0?"even":"odd")
}
c.call(10)
參數還可以給預設值
c = { n=2->
println(n%2==0?"even":"odd")
}
接著介紹一個很特別的語法:代表執行4次function。{ n-> print(n)}
就代表Closures,數字4代表執行的次數,times是保留字代表次數。
4.times{ n-> print(n)}
// 輸出
// 0123
如果不想帶入參數,可以改寫成以下方式,it 就像是java的this
// 更簡單的方式
4.times{ print it}
Collection Type
使用「[]
」宣告Collection Type
l = [1,2,3]
println l
println l.class// 輸出
// [1, 2, 3]
// class java.util.ArrayList
也可以直接使用LinkedList宣告型別
LinkedList l = [1,2,3]
增加元素除了可以使用add function,還可以直接用 「<<
」
l = [1,2,3]
l << 4
println l// 輸出
// [1, 2, 3, 4]
合併兩個list
l = [1,2,3]
l = l + [5,6,7]
println l// 輸出
// [1, 2, 3, 5, 6, 7]
移除特定元素
l = [1,2,3,4,5]
println l - [1,4]// 輸出
// [2, 3, 5]
Collection有多種種 closure,像是「each」
l = [1,2,3,4,5]
l.each { println it }// 輸出
// 1
// 2
// 3
// 4
// 5
Collection也有「eachPermutation」 closure 代表所有的排列組合。「reverseEach」代表倒轉。
Set Type
s = ['java','js','python'] as Set
println s
println s.class// 輸出
// [java, js, python]
// class java.util.LinkedHashSet
LinkedHashSet和ArrayList 不同的地方在於不會有同樣的元素,假設在LinkedHashSet 加上兩個相同元素會印出什麼:
s = ['java','js','python','js'] as Set
println s// 輸出
// [java, js, python]
Map Type
m = [name:'Sumemr', year:2021]
println m// 輸出
// [name:Sumemr, year:2021]
Map 使用each
m.each { k,v->
println "key:"+k+" value:"+v
}// 輸出
// key:name value:Sumemr
// key:year value:2021
map 取得value,有多種方式
m.name
m['name']
m.get('name')
設定value,也有多種方式。
m.tel=value
m['tel']=value
Methods
宣告method,第一個int是回傳值類別。
int product(int x, int y) {
return x*y
}
也可以改成,就算沒有寫return,最後一行程式也會自動return
def product(int x, int y) {
x*y
}
呼叫方式可以有多種方式:
product(10,5)
product 10,5
參數可以設定預設值,且呼叫的時候直接給後面參數值即可
int product(int x=3, int y) {
return x*y
}result = product 5
println result// 輸出
// 15
當Map 做為參數傳遞的時候可以不用加上「[]
」
void display (Map productDetails){
println productDetails.name
println productDetails.price
}
display price:1000,name:'Iphone'// 輸出
// Iphone
// 1000
Classes and Objects
一個檔案可以有多個class,Groovy Class 可以不用有constructor。如果宣告object 要給值參數為map。
package com.groovy.democlass Patient {
def firstname,lastname,age
}p = new Patient(firstname:'Summer', lastname:'Wang', age: 35)
println p.firstname+ " "+p.lastname+ " "+p.age
Groovy 會自動產生getter和setter,也可以修改getter和setter內容。
class Patient {
def firstname,lastname,age
void setLastname(lastname) {
if(lastname==null) {
throw new IllegalArgumentException("Last Name can not be null")
}
this.lastname = lastname
}
}
建立static,method和變數都可以使用。
static hospitalCode = "Best Hospital"