Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Groovy Tutorial

Groovy Tutorial

Avatar for shihpeng

shihpeng

May 27, 2013
Tweet

More Decks by shihpeng

Other Decks in Technology

Transcript

  1. What is Groovy? • “Groovy is an agile dynamic language

    for the Java Platform with many features that are inspired by languages like Python, Ruby and Smalltalk, making them available to Java developers using a Java-like syntax.”
  2. Why Groovy? • 使用Grails。 – Scala的主要web framework – Lift,對 Spring/Hibernate的支援並不好。

    • 學習以scripting language的方式撰寫程式。 – 例如Python。 • Groovy已成為JSR-241標準。 – JSR-241: Groovy – A New Standard Programming Language for the Java Platform • Groovy/Grails有VMware撐腰。
  3. Why Groovy? • 因為使用Grails: – 可以學習以Django或RoR的方式進行web application的開發; – 也能學習Spring、Hibernate、Spock等各式 frameworks。

    • 因為使用Groovy: – 可以熟悉scripting language的撰寫方式與慣例 (conventions)。 – 未來不管是轉戰Python或Scala都有助益。 • 正所謂「進可攻,退可守」。
  4. 資料來源 • Beginning Groovy and Grails From Novice to Professional.

    Appress, 2008. • Groovy in Action. Manning, 2007. • Grails in Action. Manning, 2009. • 官方文件
  5. IDE • 可使用Eclipse及其plug-in • IntelliJ IDEA CE僅支援Groovy,Ultimate Edition才支援Grails開發。 • GGTS

    – Groovy/Grails Tool Suite – 官方出的Groovy/Grails開發版Eclipse – http://grails.org/products/ggts
  6. 資源 • 中文資源非常少 • 官方教學文件 http://groovy.codehaus.org/Beginners+Tutori al • Groovy in

    Action http://www.manning.com/koenig2/ • StackOverflow http://stackoverflow.com/questions/tagged/gr oovy
  7. Groovy語法改變部分 • 以下套件不再需要import: – java.lang.* – java.net.* – java.io.* –

    java.util.* – groovy.lang.* – groovy.util.* • 建議全面移除代表敘述結尾的分號 (;)
  8. GroovyBean • 03~06, 19行: – 這5行定義了一個完整的GroovyBean。 – 所有定義在GroovyBean中的成員變數預設即成 為其屬性 (property)

    。 – 所有GroovyBean中的屬性存取都要透過 getter/setter,16行看起來雖像直接使用,事實 上是getXxx()的簡寫。 • 10~12行: – GroovyBean可透過預設的建構子直接在建立物 件時給予屬性參數。
  9. Groovy語法改變部分 • 09, 15行: – Groovy可選擇是否給予變數明確的資料型態, 若否,可以def宣告變數。 – 事實上以def宣告的變數,其變數型態均為 Object。

    • 16行: – System.out.println() 轉為使用Groovy提供 的println方法;Groovy的方法呼叫若有給予 參數時,括號可省略;無參數時則不可省略。 – 這邊的println方法使用了Groovy的GString, 能進行簡單的內容代換。
  10. 使用Groovy Collection Notation 與Closure • 09~13行: – 以類似Python list的方式進行list的建立與賦值。 –

    同樣地,可以透過[:]語法進行map的建立,例 如: mapping = [“a”: 123, “b”: 456] – 建議全面移除代表敘述結尾的分號 (;) • 15~17行: – 15行呼叫了list的each()方法(省略了括號),並 傳入一個closure。 – java.util.Collection.each(Closure)會 呼叫該closure多次並將list中的元素一一作為參 數傳給該closure。16行中該closure做的事情就 是印出參數中的資訊。
  11. Closures • Groovy closure是一組以大括號 {...} 包圍的程式 碼區塊;這些程式碼可以指派給類別屬性、變數、 或作為方法的參數。 • Groovy中的大括號可用於建立:

    – Closure實體; – 程式碼區塊: • 類別、界面、方法及initializer定義; • 或與各關鍵字搭配使用的場合:if, else, switch, ...等等。
  12. Closures • Closure中的程式碼會在被呼叫時執行,相當類似 於Java方法;但closure本身就是物件,這是兩者最 大的差別。 – Closure的類別為<script-name>$_run_closureX; • <script-name>為程式所在的script檔名,X為編號。 •

    類似匿名類別,類別定義是在編譯時由compiler自動產生的。 – 實作groovy.lang.Closure抽象類別。 • 在任何時候想檢查Groovy中物件的型態,可使用 Object.class。 – 也就是Object.getClass()方法。
  13. Closures • Closure也可以像方法般設定參數: – 在起始大括號後列出參數列 (可0~n個,數量不限),列 完後加上 -> (dash followed

    by a greater-than sign ),其後 即為closure主體。 • 若closure沒有設定任何參數 (連 -> 都沒有), closure依然存在一個預設參數,名為it。 – 此時若呼叫closure時沒有給予參數,it的值為null。 – 此時若呼叫closure時給予多於一個參數, Closure.call()會發生例外。 – 上述Todo class的例子中,就使用了it參數。
  14. 編譯Groovy • 如果想取得script的Java bytecode而非直接執行, 可使用 > groovyc Hello.groovy 來編譯script檔;編譯後會產生Hello.class。 •

    編譯後的.class檔可以透過 > java –cp %GROOVY_HOME%/embaddable/groovy-all- <version>.jar;. Hello “Tom” 來執行。 – Groovy is Java, 故得證。
  15. Groovy Shell與Groovy Console • Groovy Schell是一個讓開發者可以建立、執行、保 存和讀取Groovy script與類別的命令列應用程式 (即一個shell)。要啟動Groovy Shell,執行

    > groovysh即可進入。 • Groovy Console則是圖形化版本的Groovy Shell;可 透過直接點擊或執行> groovyConsole來啟動。 – 對於不是非常熟悉Groovy Shell的使用者,建議使用 Groovy Console;Groovy Shell因為shell環境的關係,程 式撰寫時要注意的地方更多些。
  16. 集合 (Collections) • Groovy支援許多類型的集合型態,例如:lists、 ranges、sets、arrays以及maps。 介紹 實作Java介面 預設使用Java類別 Lists 有序的資料集合。

    java.util.List java.util.ArrayList Ranges 連續數值的串列,例 如1~10或a~z。 groovy.lang.Range groovy.lang.XxxRange Sets 無序的資料集合,而 且其中不包含重複的 值。 java.util.Set java.util.HashSet Arrays 即Java arrays。 None None Maps 無序的key/value pairs 集合,同一map中key 為唯一。 java.util.Map java.util.LinkedHash Map
  17. 特殊運算子 • Method closure operator (.&) 可以讓方法如同 closure般被存取以及像變數般傳遞。 – 透過method

    closure operator,我們可以將Java方法以 closure的方式給予外界使用。例如println方法。
  18. 特殊運算子 • Method closure operator (.&) 可以讓方法如同 closure般被存取以及像變數般傳遞。 – 透過method

    closure operator,我們可以將Java方法以 closure的方式給予外界使用。例如println方法。
  19. 學習資源 • For those new to both Java and Groovy

    – http://groovy.codehaus.org/For+those+new+to+both+Jav a+and+Groovy • Beginner’s Tutorial – http://groovy.codehaus.org/Beginners+Tutorial • Differences from Java – http://groovy.codehaus.org/Differences+from+Java • Differences from Python – http://groovy.codehaus.org/Differences+from+Python • IBM developerWorks Java.next系列文章 – http://www.ibm.com/developerworks/library/j-jn1/