Groovy
“Groovy有超过Java将能够提供的甜点,例如它具有轻易地在宿主程序中嵌入并编译,以提供定制业务规则的能力,还有它如何为领域特定语言(Domain-Specific Language)提供优雅,简洁并且可读性好的语法的能力.”
Guillaume Laforge,
Groovy的项目带头人
Groovy入门
Groovy并不像我们在这个报告中涵盖的一些语言那样具有冒险性质,但绝对是你应该感兴趣的一种JVM语言。它已经成为了一种受到开发者信任的成熟选择,这时Java开发商的伤害,以及动态类型这些都不是问题。
无论如何,我都不会是那种争论何时给玩转一种编程语言一次机会的人。
Java变得过分充实
Java开发者可以在Groovy中深入编程并且变得多产。匹配Java的语言有希望或者这看起来将会是未来的趋势,2.0发行版中已经加入了Java7项目的Coin增强.另外Groovy还使得日常使用Java遇到的坎坷变得平滑。安全的导航(?.)以及 Elvis(?:)都算是很棒的例子。
// streetName will be null if user or
// user.address is null - no NPE thrown
def streetName = user?.address?.street
// traditional ternary operator usage
def displayName = user.name ? user.name : "Anonymous"
// more compact Elvis operator - does same as above
def displayName = user.name ?: "Anonymous"
“Groovy是一种多样性的JVM语言.使用一种同Java相近的语法,这种语言是易学的,并且允许你编写从脚本到完整的应用程序代码,包括强大的 DSL(领域特定语言)。Groovy很可能是JVM上唯一使得运行时的元编程、编译时的元编程、动态类型以及静态类型容易处理的语言。”
CÉDRIC CHAMPEAU,
Groovy中的高级软件工程师
闭包(Closure)
我们预期Groovy将止步于句法功能,然而我们却在文档中又发现“闭包”。为什么称这超越了我们的预期呢,因为Groovy函数值中的一等公民、更高级别的函数以及lambda表达式,这些都得到了支持。
square = { it * it } // ‘it’ refers to value passed to the function
[ 1, 2, 3, 4 ].collect(square) // [2, 4, 9, 16]
标准库对于闭包恰到好处的应用使得使用它们成为一种享受,并且也证明了它们的实力。下面是使用闭包的语法糖作为方法后面参数的好例子:
def list = ['a','b','c','d']
def newList = []
list.collect( newList ) {
it.toUpperCase()
}
println newList // [A, B, C, D]
集合
几乎所有的应用程序都依赖于集合。不幸的是集合大量的戳到了Java的痛处。而如果你怀疑我的这种说法,请尝试做一些有趣的JSON操作。Groovy为集合的定义将原有的语法打包,并且为了强大的可操作能力,着重使用了闭包。
def names = ["Ted", "Fred", "Jed", "Ned"]
println names //[Ted, Fred, Jed, Ned]
def shortNames = names.findAll { it.size() <= 3 }
println shortNames.size() // 3
shortNames.each { println it } // Ted
// Jed
// Ned
静态类型
人们常常振奋于动态语言,因为你用很少的代码就能获得更多的功能。这常常很少被理解,而剩下的被带回去维护。因此我们能够看到越来越多的动态语言获得静态类型,而且反之亦然。
Groovy2.0加入了静态类型
静态类型缘何且如何提升了Groovy?
“静态检查使得从Java到Groovy的转型的之路更加的平滑。许多人加入(后续还有更多人加入)Groovy,因为它轻量级的语法,以及所有被移除的 样板,但是,举个例子,不想(或者不需要)使用动态特性。他们往往很难理解Groovy编译时不像他们以前那样抛出错误,因为他们实在是不能理解 Groovy是一门动态语言。对于他们来说,我们现在有了@TypeChecked。第二个原因是性能表现,由于Groovy仍然支持更老的JDK(现在 是1.5),而动态调用支持对它们不可用,因此为了代码的关键性能部分,你可以有静态的编译了的代码。还要注意的是,静态编译对于那些想要免受猴急修补 (monkey patching)的框架开发者来说是有趣的(基于能够在运行时改变一个方法的行为这一事实)。”
Cédric Champeau
Groovy的高级程序工程师
Groovy也不例外,静态检查可以通过相关代码中的@Typechecked注解实现.
import groovy.transform.TypeChecked
void someMethod() {} <&br>
@TypeChecked
void test() {
// compilation error:
// cannot find matching method sommeeMethod()
sommeeMethod()
def name = "Marion"
// compilation error:
// the variable naaammme is undeclared
println naaammme
}