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



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