1. 程式人生 > >Groovy入門教程

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