在 Java 專案上使用 Groovy

Groovy 可以訪問所有 java 類,實際上 Groovy 類是 Java 類,可以直接由 JVM 執行。如果你正在開發 Java 專案,那麼使用 Groovy 作為一種簡單的指令碼語言來與你的 Java 程式碼進行互動是一件很容易的事情。

為了使事情變得更好,幾乎任何 Java 類都可以重新命名為 .groovy 並編譯和執行,並且將完全像它一樣工作,groovy 接近於 Java 的超集,這是 groovy 的既定目標。

Groovy 有一個 REPL。groovysh 附帶了 Groovy,如果你的類路徑設定正確,可以用來快速例項化和測試 Java 類。例如,如果你的 classpath 指向你的 eclipse“classes / bin”目錄,那麼你可以將檔案儲存在 eclipse 中,跳轉到 groovysh 並例項化該類以測試它。

使用 Groovy 而不僅僅是 Java 的原因是:類載入器在編譯時拾取新類很有用。你通常不需要在開發時退出/重新啟動 groovysh

語法是 TERSE。這對於可維護的程式碼來說並不是很好,但對於指令碼和測試,它可以顯著減少程式碼。它所做的一件大事就是消除已檢查的異常(或者更準確地說,將所有已檢查的異常轉換為未經檢查的異常)。這會像這樣開啟程式碼(一秒後列印你好):

class JavaClass {
    public static void main(String[] args) {
        try {
            Thread.sleep(1000);
        } catch(InterruptedException e) {
            // You shouldn't leave an empty catch block, but who cares if this was interrupted???
        }
        System.out.println("Hello!");
    }
}

進入 Groovy 的:

Thread.sleep(1000)
print "Hello!"

Groovy 也有非常緊湊的初始化語法。這允許你根據需要指定資料而無需考慮它:

在 Java 中初始化地圖你應該做這樣的事情:

String[] init = { "1:Bill", "2:Doug", "3:Bev" };
// Note the rest of this can be put in a function and reused or maybe found in a library, but I always seem to have to write this function!
Map m = new HashMap<Integer, String>();
for(String pair : int) {
    String[] split = pair.split(":");
    m.put(new Integer(split[0]), split[1])
}

這還不錯,但還需要維護。在 groovy 你只會使用:

Map map = { 1 : "Bill", 2 : "Doug", 3 : "Bev" }

你完成了。列表語法同樣簡單。

另一個非常大的優勢是 groovy 的閉包語法。它非常簡潔有趣,維護起來有點困難,但對於不是優先考慮的指令碼。舉個例子,這裡有一些 groovy 程式碼可以找到當前目錄中包含單詞 Hello 的所有 .txt 檔案:

println new File('.').files.findAll{ it.name.endsWith('.txt') && it.text.contains('Hello') }.collect{ it.name }

這個例子使用了一些 Groovy 技巧:

  • .files 指的是 getFiles() 方法 - groovy 可以隨意在 getter / setter 和屬性語法之間切換

  • it. 指的是迭代的當前元素。{ it }{ it -> it } 的捷徑,例如:

    [1,2,3] .collect {it ^ 2} == [1,4,9]

  • it.text(其中 it 是一個檔案)使用方法 groovy 新增到 File 來檢索檔案的整個文字。這在指令碼中非常有用。