groovy 的特点:
- groovy 继承了 java 所有的语法,即当忘了 groovy 的语法时可以写成 java 代码,groovy 和 java 代码混合在一起也能执行
- groovy 和 java 一样,都运行在 JVM 上,源码都是先编译成 class 字节码
- groovy 默认会导入以下常用包,因此在使用如下包中的类时不需要导包
- java.lang
- java.util
- java.io
- java.net
- java.math.BigDecimal
- java.math.BigInteger
- groovy.lang
- groovy.util
注释
groovy 注释和 java 注释一样,支持行注释和块注释:
// 单行注释
println "Hello"
/**
* 块注释
*/
println "Hello"
定义变量、方法
groovy 为弱类型语言,会自动推断类型
1、使用 def 定义变量(def 关键字可以省略),且变量不用指定类型,数据类型可以随意更换
def str = "世界"
str = "世界"
2、groovy 方法:
- 定义:使用 def 关键字,该关键字可以省略不写
- 方法参数:方法参数类型可写可不写
- 写了参数类型则必须传入相应类型的参数
- 不写参数类型可以传入任意类型的参数
- 返回值:groovy 所有方法都有返回类型
- 如果没有返回值,则会返回 null(groovy 没有 void 类型)
- 返回类型可以省略不写,不写的话返回类型取决于最后一行的代码的类型
- 返回类型可以省略不写,如果返回类型省略不写,则该方法必须加上 def 关键字
- return 关键字可以省略不写 ```groovy / 无返回值函数:返回null / def out(String msg) { println msg }
print out(‘世界’) // 输出:世界 null
/ 省略return关键字 / def multi(x, y) { x * y }
println multi(“世界”,3) // 输出:世界世界世界
3、groovy 的类、方法的默认修饰符都是 public,且可以省略不写
<a name="OENlV"></a>
#### 字符串
字符串分为三种:单引号、双引号、三引号
- 单引号:不会进行转义,按文本输出
- 双引号:会进行转义,可以使用 ${} 引用变量的值
- 三引号:输出一段文本,可以直接加空格和换行
```groovy
name = '李四'
println 'name is ${name}'
println "name is ${name}"
println '''name is ${name}
换行输出
'''
结果:
name is ${name}
name is 李四
name is ${name}
换行输出
基本数据类型
groovy 是纯面向对象的语言,没有 java 中的 8 种基本值类型,只有如下几种包装类:
- 整数默认:Integer
- 浮点数默认:BigDecimal
- 布尔类型默认:Boolean
如果需要显示指定 Long 类型,在字面量后面加 L,显示指定 Double 类型,在字面量后面加 D
x = 15
y = 12.8
z = false
m = 12L
n = 12.5D
println x.class // class java.lang.Integer
println y.class // class java.math.BigDecimal
println z.class // class java.lang.Boolean
println m.class // class java.lang.Long
println n.class // class java.lang.Double
容器类
分 List、Map 和 Range
1、List:使用 [ ] 定义,元素之间使用逗号 , 隔开
list = [121, 2.3, 'Hello', false, null] // 定义
println list.size() // 获取集合大小
println list[2] // 获取index为2的元素
// 在结尾添加元素的两种写法
list.add(100)
list << 100
// 在指定位置添加元素,原本index大于等于3的元素后退一位
list.add(3, 89)
// 删除指定index的元素
list.remove(0)
// 删除某集合的元素
list -= [2.3, null]
// 清空集合
list.clear()
// 使用集合的.each方法遍历
list.each {
println it // it是遍历过程中的每一个元素
}
2、Map:
- 使用[key : value]定义,元素之间使用逗号 , 隔开
- key 必须是 String,也可以不使用引号自动转为 String
def demoMap = ['name' : '风神', 'age' : 18, 'isGay' : false]
println demoMap.size() // 获取map大小
println demoMap.name // 通过key获取值
demoMap << ['hehe' : '777'] // 添加元素
// 遍历map
demoMap.each {
println it.key
println it.value
}
3、Range:
// 范围从1到10
def demoRange = 1..10
// 范围从1到9
def demoRange2 = 1..<10
println(demoRange2.from) // 获取起始值
println(demoRange2.to) // 获取最大值
闭包
闭包是一段代码块,注意闭包也是数据类型,所以可以把闭包作为方法的参数或者返回类型。
如果我们要筛选指定数n范围内的奇数,普通写法如下:
def getOdd(Integer integer) {
for (i in 1..integer) {
if ((i & 1) == 1) {
println i
}
}
}
getOdd 12
如果需要获取偶数,则需要再写一方法:
def getOdd(Integer integer) {
for (i in 1..integer) {
if ((i & 1) == 0) {
println i
}
}
}
getOdd 12
使用闭包:
def get(Integer integer, Closure closure) {
for (i in 0..integer) {
closure(i)
}
}
// 输出奇数
get(12, {
if ((it & 1) == 1) {
println(it)
}
})
// 输出偶数
get(12, {
if ((it & 1) == 0) {
println it
}
})
闭包接受参数问题:
- 闭包只有一个参数时,默认生成隐式变量 it
- 闭包不需要接受参数时,也会生成隐式变量 it,只不过值为 null
- 多个参数,使用 -> 将参数列表和行为隔开 ```groovy // 0个参数 closure = { println it }
closure.run() // 输出:null
// 1个参数 def test(Closure c){ c(“世界”) }
closure = { println it }
test closure
// 2个参数 def test(Closure c) { c(“世界”, 12) }
closure = { x, y -> println x println y }
test closure ```