groovy

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章