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
,單引號引起的字符串不支持$占位符寫法.