Java和Groovy的區別

1. 默認導入

以下包和類會被Groovy自動引入

  • java.io.*
  • java.lang.*
  • java.math.BigDecimal
  • java.math.BigInteger
  • java.net.*
  • java.util.*
  • groovy.lang.*
  • groovy.util.*

2. 函數重載

在Groovy中,方法在運行時被選擇,方法基于運行時參數的類型而選擇;在Java中正好相反,方法基于參數聲明的類型,在編譯時被選擇。
下面代碼是用java寫的,可以被Java和Groovy編譯,但是結果卻不同:

int method(String arg) {
    return 1;
}
int method(Object arg) { 
    return 2;
}
Object o = "Object";
int result = method(o);

在Java中,結果為:

assertEquals(2, result);

然而在Groovy中,結果為:

assertEquals(1, result);

這是因為Java使用靜態的方法,o被聲明為Object,然而Groovy在運行時選擇。

3. 數組初始化

在Groovy中,{...}被當成閉包,所以你不能用{...}來創建數組,只能用[...]

int[] array = [1,2,3]

4. 包的作用域

在Groovy中,省略屬性的修飾符默認不是包訪問權限:

class Person { 
    String name
}

屬性默認會有getter和setter方法,也可以用.訪問,如果想創建一個有包訪問權限的屬性,可以加一個@PackageScope注解:

class Person { 
   @PackageScope String name
}

5. 自動資源管理

源自Java 7 的自動資源管理并未在Groovy中得到支持,相應的,Groovy提供了另外一種依靠閉包的更符合習慣的方法,例如在Java中:

Path file = Paths.get("/path/to/file");
Charset charset = Charset.forName("UTF-8");
try (BufferedReader reader = Files.newBufferedReader(file, charset)) {
    String line; 
    while ((line = reader.readLine()) != null) { 
        System.out.println(line);
    }
} catch (IOException e) { 
   e.printStackTrace();
}

在Groovy中可以更加簡潔:

new File('/path/to/file').eachLine('UTF-8') {
    println it
}

還有一種更像Java的寫法:

new File('/path/to/file').withReader('UTF-8') { reader -> 
    reader.eachLine { 
        println it
    }
}

6. Lambdas

java8中的Lambdas表達式

Runnable run = () -> System.out.println("Run");
list.forEach(System.out::println);

java8中的Lambdas或多或少被認為是匿名內部類,Groovy不支持這種寫法,但是有閉包代替:

Runnable run = { println 'run' }
list.each { println it }  // or list.each(this.&println)

7. GStrings

雙引號引起來的字符串是GString,單引號引起來的是String,單引號引起的字符串不支持$占位符寫法.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • groovy是什么 Groovy 是下一代的Java語言,跟java一樣,它也運行在 JVM 中。 作為跑在JVM...
    ronaldo18閱讀 711評論 0 4
  • Groovy 2.0新特性http://www.infoq.com/cn/articles/new-groovy-...
    葡萄喃喃囈語閱讀 2,001評論 0 2
  • 前言 由于項目需要用到 Groovy 語言,這兩天對其進行了粗略的學習,本文是對學習做的一個簡單總結,主要內容參考...
    簡單的土豆閱讀 189,105評論 12 201
  • Groovy學習目錄-傳送門 Groovy試圖對Java開發人員盡可能自然。 我們試圖在設計Groovy時遵循最小...
    化作春泥_閱讀 1,280評論 0 3
  • 1.羊草 羊草又名堿草,它是歐亞大陸草原區東部草甸草原及干旱草原上的重要建群種之一。我國東北部松嫩平原及內蒙古東部...
    塔塔妹閱讀 40,655評論 8 12