最近在使用的平台上写脚本的语言是Groovy,所以也学习一下,作为 Java 开发者,Groovy 对我们来说会非常友好,而且它的语法更简洁且支持动态类型,所以其实了解下Java和Groovy的差异点就可以快速上手了,以下是 Groovy 与 Java 不同的常用语法和核心差异点,
1 明显的语法差异
1. 变量声明(动态类型)
- Groovy 支持动态类型,用
def
声明变量(类型自动推断):def name = "Groovy" // 自动推断为 String def num = 42 // 自动推断为 Integer
- 也可以显式声明类型(类似 Java):
String name = "Groovy"
2. 分号可选
- 分号
;
在 Groovy 中是可选的(除非一行写多条语句):println("Hello, Groovy") // 不需要分号
3. 方法调用括号可选
- 当方法参数明确时,括号
()
可以省略:println "Hello, Groovy" // 等同于 println("Hello, Groovy")
4. 字符串:单引号 vs 双引号
- 单引号:普通字符串(类似 Java 的
String
):def s1 = 'Hello'
- 双引号:支持插值(GString):
def name = "Groovy" def s2 = "Hello, $name!" // 输出 "Hello, Groovy!"
5. 集合的简化语法
- List(默认实现是
ArrayList
):def list = [1, 2, 3] // 创建 List list << 4 // 添加元素 println list[0] // 访问元素
- Map(默认实现是
LinkedHashMap
):def map = [name: "Groovy", age: 20] // 键默认是字符串,无需引号 println map.name // 访问键值(类似属性)
2 核心概念差异
1. 闭包(Closure)
- Groovy 的闭包类似 Java 的 Lambda,但更强大:
def closure = { a, b -> a + b } println closure(1, 2) // 输出 3
- 隐式参数
it
(当闭包只有一个参数时):def greet = { "Hello, $it!" } println greet("Groovy") // 输出 "Hello, Groovy!"
2. 安全导航操作符(?.)
- 避免空指针异常:
def user = null println user?.name // 输出 null,而不是抛异常
3. 运算符重载
- Groovy 允许运算符重载(例如
+
可自定义):class Box {int valueBox plus(Box other) { new Box(value: this.value + other.value) } } def b1 = new Box(value: 1) def b2 = new Box(value: 2) println (b1 + b2).value // 输出 3
4. Groovy Truth(真值判断)
- Groovy 中以下情况为
false
:- 空集合/字符串/Map
null
- 数值 0
false
- 示例:
if ([]) { println "不执行" } else { println "空列表为 false" }
3 常用功能增强
1. 集合操作
- 强大的链式操作:
def numbers = [1, 2, 3, 4] def doubled = numbers.collect { it * 2 } // [2, 4, 6, 8] def even = numbers.findAll { it % 2 == 0 } // [2, 4]
2. Elvis 操作符(?:)
- 简化三元表达式:
def name = user.name ?: "Unknown" // 如果 user.name 为 null,返回 "Unknown"
3. Switch 支持更多类型
- 可以匹配列表、范围、类型等:
def x = 5 switch (x) {case 1..10: println "在1到10之间"; breakcase [11, 12]: println "是11或12"; breakcase String: println "是字符串"; break }
4 常用的集合操作
Groovy提供了丰富的集合操作,以下是一些常用的集合操作及其示例:
1. each
方法
each
方法用于遍历集合中的每个元素,并对每个元素执行指定的操作。
def list = [1, 2, 3, 4, 5]list.each { element ->println element
}
输出:
1
2
3
4
5
2. collect
方法
collect
方法用于对集合中的每个元素进行转换,并返回一个新的集合。
def list = [1, 2, 3, 4, 5]def squaredList = list.collect { element ->element * 2
}println squaredList
输出:
[2, 4, 6, 8, 10]
3. find
方法
find
方法用于查找集合中满足特定条件的第一个元素。
def list = [1, 2, 3, 4, 5]def evenNumber = list.find { element ->element % 2 == 0
}println evenNumber
输出:
2
4. findAll
方法
findAll
方法用于查找集合中所有满足特定条件的元素,并返回一个新的集合。
def list = [1, 2, 3, 4, 5]def evenNumbers = list.findAll { element ->element % 2 == 0
}println evenNumbers
输出:
[2, 4]
5. any
方法
any
方法用于检查集合中是否存在至少一个满足特定条件的元素。
def list = [1, 2, 3, 4, 5]def hasEvenNumber = list.any { element ->element % 2 == 0
}println hasEvenNumber
输出:
true
6. every
方法
every
方法用于检查集合中的所有元素是否都满足特定条件。
def list = [2, 4, 6, 8]def allEvenNumbers = list.every { element ->element % 2 == 0
}println allEvenNumbers
输出:
true
5 Java 开发者易错点
1. ==
与 equals()
- Groovy 中
==
相当于equals()
,如果要比较引用用is()
:def s1 = new String("Groovy") def s2 = new String("Groovy") println s1 == s2 // true(内容相等) println s1.is(s2) // false(引用不同)
2. 数组定义
- Groovy 中定义数组需明确类型或使用
as
关键字:def arr1 = [1, 2, 3] as int[] // 正确 int[] arr2 = [1, 2, 3] // 正确
3. 默认导入的包
- Groovy 自动导入了常用包(如
java.util.*
,groovy.util.*
等),注意可能的命名冲突。
6 Groovy的优势
- 脚本化执行:Groovy 可以直接运行脚本,无需
public static void main
。 - 利用 Groovy Console:快速测试代码片段。
- 逐步引入闭包和 DSL:Groovy 适合编写领域特定语言(DSL)。