Groovy入門教程
HELLO!大家好!我是咕嚕大大,專注程式設計和單身30年!
尊重原創,請大家轉載時註明該文章來自:http://blog.csdn.net/ymh198816/article/details/43817435
最近我的BOSS要開始一個新的電商專案,並初步定下開發語言為Java,因為擴充套件性好,安全性高,再加上中國滿大街的Java開發人員和鋪天蓋地的Java開發資料,都讓我們覺得在人力資源和開發方面會比較有保障。但是後來我們在確定開發框架的時候就拿不定主意了,有部分人認為應該使用目前普遍流行的SSH框架(Struts2+Spring+Hibernate), 還有部分人希望使用現在發展迅猛的Grails框架,因為Grails是一個站式服務的框架,開發速度會比SSH框架更快。但問題是在中國使用和了解該框架的人少得可憐,而且又是一個比較年輕的框架,穩定性和擴充套件性都需要經過時間的考驗和積累,大部分人還是持觀望的態度。更加有趣的地方在於Grails使用的不是源生的Java語言,而是使用Groovy來作為該框架的開發語言。剛好最近在做Grails框架的調研,所以就順便寫一篇Groovy的入門教程,希望能幫助更多的人瞭解Groovy這門語言。
根據Groovy的官方文件對該門語言的介紹,我們可以瞭解到Groovy有如下特性:
1. Groovy是執行在JVM(Java Virtual Machine)上的敏捷的動態語言,所以Groovy也是一門弱型別的語言,並且可以直接編譯成Java位元組編碼,執行在任何具備Java執行環境(JVM)的裝置上。
2. 摒棄了Java語言中少部分存在爭議和不便於敏捷開發的部分,並結合了Ruby和Python等其它語言的優秀特性,像動態型別,閉包等,使得Groovy這門語言對開發人員更加友好並易於維護。
3. 能和所有的Java類庫無縫對接。
4. 大部分語法和特性和Java類似,使得Java開發人員對Groovy這門語言的學習曲線近乎為零。
5. 新加入Assert方法,方便程式設計師做單元測試
安裝GROOVY
接下來我們開始介紹Groovy的安裝方式(MAC OS):
1. 開啟你的Ternimal,並輸入以下命令設定你係統中Groovy的binary檔案地址:
>> export GROOVY_HOME=~/your/groovy/path
2. 並將GROOVY_HOME/bin配置進系統中path環境中,並寫進bash檔案中,這樣就能在terminal中呼叫Groovy相關的命令
>> GROOVY=$GROOVY_HOME/bin
>> echo "export PATH=$GROOVY:$PATH" >> ~/.bash_profile
接下來重啟你的terminal,然後輸入 >>groovysh,如果你看見下面的畫面,那麼證明你的GROOVY安裝成功了!!!
不過上面會有一個警告:????: Module [groovy-nio] - Unable to load extension class [org.codehaus.groovy.runtime.NioGroovyMethods] 貌似是沒有成功載入某個class,求大牛提供解決方案和解釋一下原因我是弱雞。
GROOVY的ECLIPSE外掛下載地址:
傳送門:http://marketplace.eclipse.org/content/groovygrails-tool-suite-ggts-eclipse-luna-44
GROOVY檔案示例:
package com.groovy.fundamental
import java.util.Date;
class basicGrammar {
def my_list = [3.1415926, "Hello World!!", new Date()];
def my_map = ['firstAttr':'咕嚕大大','secondAttr':11.11,'thirdAttr':my_list];
basicGrammar() {
super();
}
public void printList_java() {
println my_list.getClass();
assert my_list.get(1) == "Hello World!!";
}
def printList_groovy() {
println my_map.getClass();
assert my_map.get('thirdAttr')[1] == "H World!!";
}
static main(args) {
def test = new basicGrammar();
test.printList_java();
test.printList_groovy();
}
}
從上面一個基本的groovy檔案中,
1.我們可以發現groovy可以像Java一樣使用包管理機制,同時還能引入各種Java工具類;
2. groovy檔案中可以讓Java和Groovy語法混合使用,因為Groovy最後也是編譯成Java的位元組碼檔案,它實際上也是一種Java檔案,但加入了自己的一些特性;
3. 類的定義如同Java一樣;
4. 使用def來定義變數,並根據變數的值來動態改變變數的型別;
5. 定義main方法時,不用宣告方法的作用域,預設為public,也可以不用宣告方法的返回引數型別,同時方法中引數也可以不用宣告型別,因為Groovy本身就是一個弱型別的語言。類中的建構函式也類似;
6. 包含了assert方法,方便去做單元測試。
從上面輸入的內容我們可以看見Groovy中提供的assert方法十分強大和具體,同時,Groovy中的list物件和map物件分別是java.util.ArrayList物件和java.util.LinkedHashMap物件
部分比較重要的GROOVY語法:
Groovy中定義的最重要的兩種資料型別,一種是list(java.util.ArrayList)型別,另一種則是map(java.util.LinkedHashMap)型別,其中list型別在groovy中可以相當Java的陣列來使用
定義list:
def my_list = [3.1415926, "Hello World!!", new Date()];
定義map:
def my_map = ['firstAttr':'咕嚕大大','secondAttr':11.11,'thirdAttr':my_list];
使用for迴圈:
for(content in my_list) {
println content;
}
使用range變數,用法基本與與python的range變數相同:
def myRange = 0..5;
for(content in myRange) {
print content;
}
輸出結果:012345
在Groovy中,你可以用“{}”定義一個"方法"來作為一個物件,並像一個String值或int值一樣傳入一個變數中,這就是閉包函式;在Groovy中一個閉包函式也是一個可被呼叫的方法:
def my_closure = {param -> println("hello ${param}");println("你好,世界!!")};
my_closure.call("咕嚕大大");
如果不定義閉包函式的引數,則Groovy預設會使用“it“來代替這些引數:
def my_closure = {println("hello"+it);println("你好,世界!!")};
my_closure.call("咕嚕大大");
閉包函式可以作為其它方法裡的引數:
def fun(int i, Closure c) {
c.call(i)
}
使用each函式配合閉包函式迴圈list物件,與Jquery中的each方法類似,同時也真是each()和閉包函式的作用,list和map的長度就不那麼重要了,它們可以不用for迴圈就能取出裡面所有的值了:
["咕嚕大大", "萌萌噠", "棒棒噠"].each({ item -> print item })
同時,如果閉包函式是方法裡最後的一個引數,那麼閉包函式可以寫在方法的括號外面
["咕嚕大大", "萌萌噠", "棒棒噠"].each(){ item -> print item }
又因為Groovy中呼叫方法時,在不引起歧義的情況下方法後面的括號可以省略["咕嚕大大", "萌萌噠", "棒棒噠"].each { item -> print item }
關於字串的處理幾乎和Java的String class一模一樣,不過Groovy中新添加了“toInteger()”的方法:
println "2014".toInteger();
Groovy和Java的區別
對於定義的浮點數變數,Groovy不會將它們建立成Float或Double物件,預設下為Groovy自己定義的型別 BigDecimal,除非你顯示地將該變數指定為Float或Double物件
def my_number = 3.14
在Groovy中你不能再像Java一樣用“{}”去定義陣列,反而你要用list去取代原先Java中的陣列
<pre name="code" class="java">String[] myArray = {"咕嚕大大","萌萌噠"}; 這是錯的!!!
String[] myArray = ["咕嚕大大","萌萌噠"]; 這才是對的!!!!
Groovy中的“==”相當於Java中的“equals()”;Groovy中“.is()”相當於Java中的“==”,用來比較兩個物件是不是相等;
def x = 5;
def y = 5;
<pre name="code" class="java"> if(x == y) {
println("在X == Y條件中x和Y的值相等!");
} else if (x.is(y)) {
println("在X is Y條件中X和Y是同一個物件!");
}
輸出結果是:在X == Y條件中x和Y的值相等!
在Groovy中你可以不寫分號,但會引起一些錯誤,比如說:
class Trial {
private final Thing thing = new Thing ( ) ;
{ thing.doSomething ( ) ; }
}
這是正確可執行的
class Trial {
private final thing = new Thing ( )
{ thing.doSomething ( ) }
}
會報“MissingMethodException!”異常,因為”{ thing.doSomething ( ) }“會被認為是一段閉包函式,然後傳入Thing()方法中作為它的引數
所以,建議大家還是按Java開發標準來,老老實實在每句sentence的後面寫上分號!
Groovy會自動為pojo物件附上set和get方法,你不用手動去設定
JAVA的寫法:
class usersBean() {
String name;
public void setName(String name) {
this.name = name
}
public String getName() {
return this.name
}
}
Groovy的寫法:
class usersBean() {
String name;
}Groovy中,在單引號裡的字串和普通的Java字串一樣,而在雙引號裡的字串則能解析 ${param}中的值:
def param = "咕嚕大大"
println "大家好!我是${param}!"
println '大家好!我是${param}!'
輸出結果是:大家好!我是咕嚕大大!
大家好!我是${param}!
方法和類都預設是public的;
“return”可以省略,會按程式碼塊中最後一句表示式的結果來返回值.