groovy是针对JVM的一种动态编程语言。
官方文档地址:http://www.groovy-lang.org/differences.html#_default_imports
部分翻译:
和java的一些区别:
1 默认导入包:
- java.io.*
- java.lang.*
- java.math.BigDecimal
- java.math.BigInteger
- java.net.*
- java.util.*
- groovy.lang.*
- groovy.util.*
2 方法:在Groovy中,方法在运行时调用。这意味方法在运行时会根据值的类型进行选择:
java
int method(String arg) {
return 1;
}
int method(Object arg) {
return 2;
}
Object o = "Object";
int result = method(o);
//在java中 结果返回的是2;而Groovy中 返回的是1
//这是因为java根据类型的定义去调用相应的方法(在这里是object类型)而groovy在运行时根据值的类型("Object"是string类型)调用相应方法
3 数组的定义:在Groovy中{…}被保留给闭包使用,所以只能用[…]这种格式
java
int[] array = [1,2,3];
4 包的范围可见性:在Groovy中省略定义包或属性的类型不代表java中的缺省类型,如果是缺省类型再Groovy中以@packageScope的方式调用;省略类型的属性代表该属性私有,且默认使用getter/setter方法。
java
class person{
String name;
}
//相当于:
class person{
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
//如果是缺省类型写为:
class person{
@packageScope String name;
}
5 ARM(Automatic Resource Management):从java7开始不支持ARM;相应的,在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();
}
//可以写成这样:
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 内部类:
- 静态内部类(推荐)
java
class A {
static class B {}
}
new A.B()
- 匿名内部类(略)
- 创建非静态内部类:
java
public class Y {
public class X {}
public X foo() {
return new X();
}
public static X createX(Y y) {
return y.new X();
}
}
//Groovy不支持y.new X() 格式.代替的写成:new X(y)
public class Y {
public class X {}
public X foo() {
return new X()
}
public static X createX(Y y) {
return new X(y)
}
}
// Groovy supports calling methods with one parameter without giving an argument;我理解的是:groovy支持调用带一个参数的方法但是没有传入参数,然后改参数的值被默认设为null;同样的规则适用于构造函数
7 lambdas:java8支持lambdas和方法引用,而groovy不支持
java
Runnable run = () -> System.out.println("Run");
list.forEach(System.out::println);
在groovy中:
html
Runnable run = { println 'run' };
list.each { println it };
// or list.each(this.&println)
8 GString:双引号括起来的值被当做GString;groovy会自动在GString和String中转换;当一个类名的字符串包含美元符号$时编译器可能会报错。
9 字符串和字符:单引号的是String ;(略…)
10 a==b :在groovy中翻译为a.compareTo(b)==0或者a.equals(b),a.is(b);