Java目前是企業級開發中非常重要的一種語言,它是強類型的語言,在編寫代碼時,會嚴格對類型進行檢測,這樣大大提高了程式的穩定性,同時也降低了Bug發生的機率。但是,有的時候,我們希望Java能不能具有類似JavaScritpt相關的特點,如不對類型進行嚴格檢測,且具有動态腳本的特點,可以作為一種腳本引擎來實作靈活的邏輯處理。
1 Groovy是什麼
哪裡有需求,哪裡就有市場。基于這種樸素的想法,開源社群也給我們開發者提供了一種非常好的腳本語言Groovy,根據官方介紹,Groovy是一種基于JVM,功能強大、類型可選(預設是弱類型的,也可以通過注解開啟類型檢測)、動态的,可與Java無縫銜接的程式設計語言。Groovy文法簡潔、易于學習,可以大大提高開發人員的工作效率,可為Java程式添加強大的功能,包括腳本功能(scripting capabilities)、特定領域的語言編寫(Domain-Specific Language)、運作時和編譯時元程式設計( meta-programming )以及函數式程式設計(functional programming)。
官網為 http://www.groovy-lang.org , 官網頁面截圖如下:

注意:目前Groovy最新版本為4.0,不過是alpha版本,還不太穩定。商業使用建議采用 Groovy 3.0.8 。
2 Groovy核心文法
Goovy語言建構在強大的JVM之上,在設計時,綜合考慮了其他程式設計語言的優勢特征,如添加了Python和Ruby等語言的特征,即動态類型轉換、閉包和元程式設計支援。這為Java開發者提供了最流行的程式設計語言特性。如果将Java語言比作老虎,那麼Groovy就是翅膀,二者配合起來,就是如虎添翼。下面給出該語言的核心文法:
////////////////////////////////////////////////////////////////////////
//定義變量
def x = 2
//列印
println x
/*
不同類型也可以指派
*/
x = "hello"
println x
msg = "world"
println "hello " + msg //hello world
println 3 / 2 // 1.5
println 3 // 2 // 3
println 3 % 2 // 1
println 3 * 2 // 6
println 3 + 2 // 5
println 3 ** 2 // 9
println 3 == 3 //true
String str = "Hello"
str = 2.3
////////////////////////////////////////////////////////////////////////
//清單
def list = []
a = list.add("Java");
println a //true
println list //[Java]
list << "F#"
println list //[Java, F#]
println list.remove("F#") //true
println list //[Java]
println list - "Java" // []
list.addAll(["java","C#"])
list.each { println "$it"}
/*
Java
java
C#
*/
list.eachWithIndex { it, i -> println "$i: $it"}
/*
0: Java
1: java
2: C#
*/
ele = list.contains( 'java' )
println ele //true
println 'java' in list //true
Collections.replaceAll(list,"java","Groovy")
println list //[Java, Groovy, C#]
////////////////////////////////////////////////////////////////////////
//定義map類型
def myMap = [:]
myMap.put("XH",'123')
myMap.put("Name",'Jack')
myMap.each { println "$it.key: $it.value" }
myMap.eachWithIndex { it, i -> println "$i: $it"}
/*
XH: 123
Name: Jack
0: XH=123
1: Name=Jack
*/
println myMap.containsKey('Name') //true
println myMap.containsValue('jack') // false 區分大小寫
println myMap.keySet() //[XH, Name]
println myMap.values() //[123, Jack]
//for疊代map
x = ""
for ( e in myMap ) {
x += e.value
x += " "
}
println x
////////////////////////////////////////////////////////////////////////
//函數定義
def sayMsg(msg="Groovy"){
"Hello,$msg"
}
println sayMsg() //Hello,Groovy
println sayMsg('Java') //Hello,Java
////////////////////////////////////////////////////////////////////////
//if分支
def func_if(x = 0){
if(x< 0) {
println "<0"
} else if(x<20) {
println "[0,20)"
} else {
println ">20"
}
}
println func_if(20) //null
//for循環
def func_for(){
def x = 0
for (i in 0 .. 10) {
x += i
}
println x //55
x = 0
for( i in [1,2,3,4,5,6,7,8,9,10] ) {
x += i
}
println x // 55
}
func_for()
////////////////////////////////////////////////////////////////////////
//Expando動态Bean類型,支援添加屬性和方法
def user = new Expando(name:"Jack")
println user //{name=Jack}
user.xh = "123"
println user //{name=Jack, xh=123}
user.info = {
println "Name: $name,XH:$xh"
}
user.info() //Name: Jack,XH:123
////////////////////////////////////////////////////////////////////////
//擴充方法 和 Metaprogramming
String.metaClass.xxxFunc = {
println "xxxFunc"
}
"str"?.xxxFunc() //xxxFunc
////////////////////////////////////////////////////////////////////////
class TestGroovyInterceptable implements GroovyInterceptable {
def sum(Integer a, Integer b) { a + b }
def invokeMethod(String name, args) {
println "Invoke method: $name,args: $args"
}
}
def test = new TestGroovyInterceptable()
//Invoke method: sum ,args: [2, 3]
test?.sum(2,3)
//Invoke method: power,args: [2, 3]
test?.power(2,3)
////////////////////////////////////////////////////////////////////////
import groovy.transform.TypeChecked
//類型檢測
@TypeChecked
Integer testTypeCheck() {
//[Static type checking] -
//Cannot assign value of type java.lang.String to variable of type java.lang.Integer
Integer num = "1"
return num
}
////////////////////////////////////////////////////////////////////////
import groovy.transform.CompileStatic
//靜态方法
@CompileStatic
int sum(int x, int y) {
x + y
}
sum(2,7) //9
////////////////////////////////////////////////////////////////////////
//類
class Student {
//隻讀
final String name = "Jack"
Integer age = 0
protected void setAge(Integer age) {
this.age = age
}
def info(){
"$name,$age,$tag"
}
//動态類型
def tag
}
def stu = new Student()
stu.setAge(33)
stu.tag = [1,2,3]
println stu.info() //Jack,33,[1, 2, 3]
////////////////////////////////////////////////////////////////////////
//JSON處理
import groovy.json.JsonOutput
def strJSON = JsonOutput.toJson([stu])
println(strJSON) //[{"age":33,"tag":[1,2,3],"name":"Jack"}]
////////////////////////////////////////////////////////////////////////
import groovy.json.JsonSlurper
def jsonSlurper = new JsonSlurper()
def object = jsonSlurper.parseText('{ "name": "Jack", "xh" : "123"}')
println(object.name)
println(object.xh)
////////////////////////////////////////////////////////////////////////
import groovy.json.JsonSlurper
def jsonSlurper = new JsonSlurper()
Object lst = jsonSlurper.parseText('[2, 3, 4, 5]')
lst.each { println it }