【Groovy快速上手 ONLY ONE】Groovy与Java的核心差异
最近在使用的平台上写脚本的语言是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 value
Box 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:
空集合/字符串/Mapnull数值 0false
示例: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之间"; break
case [11, 12]: println "是11或12"; break
case 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)。