在 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 来检索文件的整个文本。这在脚本中非常有用。