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”可以省略,會按代碼塊中最後一句表達式的結果來返回值.