title: Groovy 語言簡介
Groovy 是什麼
groovy 是運行在 JVM 中、具有象 Python,Ruby 語言特性的靈活動態語言,groovy 代碼被編譯成 java 字節碼,然後能集成到 java 應用程序中或者 web 應用程序。groovy 與 java 平臺非常融合,groovy 的許多代碼是使用 java 實現的,其餘部分是用groovy 實現的,Groovy 僅僅是創建 java 類的一種新的途徑。
Groovy Eclipse插件安裝
詳見:http://wujq4java.iteye.com/blog/1947658
groovy被稱爲java的替代語言,通過上圖可以看出,java和groovy都是建立在JVM基礎上的語言,即groovy和java一樣都可以編譯成JVM可讀的.class文件。而且groovy完全兼容java語言,即所有java代碼放到groovy代碼中都是可運行的。
Groovy 使用
只需在原有的java項目中添加如下dependency依賴:
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.3.6</version>
</dependency>
只需簡單的引用一個groovy-all.jar包就可以了,是不是很方便。如果你已經安裝好了groovy 的eclipse插件,那麼你就可以在你的java工程中通過右鍵:New -> Other -> Groovy -> Groovy Class來創建一個groovy類(比如類 GroovyTest),大概是這樣:
class GroovyTest {
public GroovyTest() {
}
static main(args) {
}
}
你會發現這個新創建的groovy類看上去和java類幾乎沒有什麼區別(除了缺少public 和 void 關鍵字以外,當然類文件變成了GroovyTest.groovy)。
Groovy 腳步特性
groovy能夠在運行時對源文件進行解釋(編譯),從而具有了腳步語言的特性。這樣的話同樣是修改源代碼,如果修改java源文件需要重新編譯打包和發佈工程,但是修改groovy源文件後你什麼都不需要做,jvm會在第一次執行修改後的groovy源文件時把它編譯成.class文件。正是這個特性,使我們在nemo-oil和nemo-mobile工程中使用groovy來管理各種業務上的返利規則(易變動),nemo-oil工程的nemo.oil.biz.OilRuleMasterBiz類示範瞭如何在java代碼中調用groovy代碼。
Groovy 完整代碼示例
/**
* 中石油返利規則委託實現
* @author Medeson.Zh
*/
class O_CUC_COMMON{
def PLATINUM = "1" //白金卡
def DIAMOND = "2" //鑽石卡
def TALLEST = 75000
def rate = 0 //返利比例,需要委託類定義
/**
* 加油卡充值返利;
* @param amount 加油金額
* @param cardtype 卡類型
* @return 返利金額
*/
public int recharge(int amount,String cardtype){
int value
if (PLATINUM==cardtype)
value = amount * 0.02
else if (DIAMOND==cardtype)
value = amount * 0.025
else
value = 0
return value
}
/**
* 套餐返利上限
* @return Map
*/
public Object active(){
int bonuse = TALLEST*rate
return ["base":TALLEST,"amount":bonuse]
}
/**
* 消費返利
* @param amount
* @return
*/
public Object consume(int amount,String cardType){
int cons_1=0,cons_2=0
if (amount>TALLEST){
cons_1 = TALLEST*rate
cons_2 = recharge(amount-TALLEST,cardType)
}
else
cons_1 = amount*rate
return ["inner":cons_1,"outer":cons_2]
}
}
Groovy 語法特性
1 沒有類型的 java,groovy在運行時自動識別類型
def var= "hello world"
println var.class
程序輸出:
java.lang.String
2 不需要的 public,groovy 中默認的修飾符就是 public,所以 public 修飾符你根本就不需要寫
def repeat(val){
for (i = 0 ; i < 5 ; i++){
println val
}
}
3 不需要的語句結束符,Groovy 中沒有語句結束符,即每條語句後不需要加“;”號,但是如果一行上有多條語句,則需要使用“;”號。
def var = "hello world"
def var2 = "dog"; def var3 = "cat"; def var4 = "bird"
4 一切皆對象,聽起來象是“衆生平等”的味道,事實上 groovy 對於對象是什麼類型並不關心,一個變量的類型在運行中隨時可以改變,一切根據需要而定。如果你賦給它 boolean ,那麼不管它原來是什麼類型,它接受 boolean 值之後就會自動把類型轉變爲 boolean 值。看下面的代碼:
def var = "hello world,groovy!"
println var
println var.class
var = 1001
println var.class
程序輸出:
hello world,groovy!
class java.lang.String
class java.lang.Integer
5 除了標準的 java.lang.String 以外(用 ’ 號括住), groovy 還支持 Gstring 字符串類型(用 “ 號括住),GString可以使用 $(變量名) 的形式獲取變量的值,看下面的代碼:
def var = "hello world,groovy!"
def repeat(val){
for (i = 0; i < 5; i++){
println "This is ${i}:${val}"
}
}
repeat(var)
程序輸出:
This is 0:hello world,groovy!
This is 1:hello world,groovy!
This is 2:hello world,groovy!
This is 3:hello world,groovy!
This is 4:hello world,groovy!
6 循環,可以使用for (i in 0 .. 5 ) 這樣的用法,其中的 0 .. 5 是一個範圍,範圍是一系列的值。例如 “0..5” 表明包含整數 0、1、2、3、4、5。
def var = "hello world,groovy!"
def repeat(val){
for (i in 0 .. 5){
println val
}
}
repeat(var)
程序輸出:
hello world,groovy!
hello world,groovy!
hello world,groovy!
hello world,groovy!
hello world,groovy!
7 Groovy 支持最常見的兩個 java 集合:java.util.Collection 和 java.util.Map。
//Groovy 中這樣來定義一個 Collection:
def collect = ["a", "b", "c"]
//除了聲明時往集合中添加元素外,還可以用以下方式向集合中添加元素:
collect.add(1)
collect << "come on"
collect[5] = 100
//Collection 使用類似數組下標的方式進行檢索:
println collect[collect.size() - 1]
println collect[5]
//groovy 支持負索引:
println collect[-1] // 索引其倒數第 1 個元素
println collect[-2] // 索引其倒數第 2 個元素
//如此可以定義一個 Map:
def map = ['name':'john', 'age':14 , 'sex':'boy']
//添加項:
map = map + ['weight':25] // 添加 john 的體重
map.put('length', 175) // 添加 john 的身高
map.father = 'Keller' // 添加 john 的父親
//可以用兩種方式檢索值:
println map['father'] // 通過 key 作爲下標索引
println map.length // 通過 key 作爲成員名索引
8 閉包是用 { 符號括起來的代碼塊,它可以被單獨運行或調用,也可以被命名。類似‘匿名類’或內聯函數的概念。閉包中最常見的應用是對集合進行迭代,下面定義了 3 個閉包對 map 進行了迭代:
map.each ({key,value-> //key,value 兩個參數用於接受每個元素的鍵-值對
println "$key:$value"})
map.each {println it} //it 是一個關鍵字,代表 map 集合的每個元素
map.each ({println it.getKey() + "-->" + it.getValue()})
//除了用於迭代之外,閉包也可以單獨定義:
def say = {word->
println "Hi,$word!"
}
//調用:
say('groovy')
say.call('groovy&grails')
程序輸出:
Hi,groovy!
Hi,groovy&grails!
Groovy 優勢
Groovy 的優勢除了其所具有的運行期解釋的特性外,還有它拋棄了 java 煩瑣的文法,同時增加一些簡潔的語法(如閉包)。同樣的語句,使用 groovy 能在最大限度上減少你的擊鍵次數——這確實是“懶惰程序員們”的福音,例如如果需要寫一個程序列出一個文件中每一行的數據,在每一行前面輸出行號,groovy只需下面幾行代碼而已:
def number = 0
new File ('test.groovy').eachLine {line ->
number++
println "$number: $line"
}
Groovy 進階
精通groovy(博客)- http://www.ibm.com/developerworks/cn/education/java/j-groovy/j-groovy.html
groovy in action 中文版(書籍)- http://vdisk.weibo.com/s/CPOlB