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阅读 3,975评论 0 4
  • Groovy 2.0新特性http://www.infoq.com/cn/articles/new-groovy-...
    葡萄喃喃呓语阅读 6,065评论 0 2
  • 前言 由于项目需要用到 Groovy 语言,这两天对其进行了粗略的学习,本文是对学习做的一个简单总结,主要内容参考...
    简单的土豆阅读 189,376评论 12 201
  • Groovy学习目录-传送门 Groovy试图对Java开发人员尽可能自然。 我们试图在设计Groovy时遵循最小...
    化作春泥_阅读 5,068评论 0 3
  • 1.羊草 羊草又名碱草,它是欧亚大陆草原区东部草甸草原及干旱草原上的重要建群种之一。我国东北部松嫩平原及内蒙古东部...
    塔塔妹阅读 41,420评论 8 12