Gradle for JAVA — Groovy

Tinghuan Wang
summer's code life
Published in
8 min readMar 25, 2021

前一篇文章「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"

--

--