Groovy 基本语法
程序员文章站
2022-07-12 15:11:09
...
本文将简单讲解Groovy
语言相关基础知识,如果你学过其他的类Kotlin
活swift
那么你讲非常轻松了解其语法。关于groovy
工程的创建和启动这里并不过多说明,大家可以直接使用idea
即可
变量定义
groovy
中变量定义具有自动推断机制,也就是无需声明类型。变量的定义可以采用def
关键字。
class Main {
public static void main(args) {
//声明一个int类型
int intObj = 2
//def关键字自动推断类型为int
def intObj2 = 2
println(intObj.class)
println(intObj2.class)
}
}
输出:
class java.lang.Integer
class java.lang.Integer
变量类型变化
在java
中无法变量类型无法改变,但对于groovy
是可以的,但是仅针对def
声明的变量。
class Main {
public static void main(args) {
def intObj = 2
println "Class type" + intObj.class + " 字面量 " + intObj
//我们把字符串赋值给一个def声明的变量
intObj = "a"
println "intObj = \"a\" 执行后 Class type" + intObj.class + " 字面量 " + intObj
}
}
输出:
Class typeclass java.lang.Integer 字面量 2
intObj = "a" 执行后 Class typeclass java.lang.String 字面量 a
当然这里需要注意,groovy
其实本质并不能改变的一个变量的类型,而是新建了一个变量。
我们这里看下反编译后的东西(了解):
public class Main implements GroovyObject {
//...
public static void main(String... args) {
CallSite[] var1 = $getCallSiteArray();
Object intObj = 2;
var1[0].callStatic(Main.class, var1[1].call(var1[2].call(var1[3].call("Class type", var1[4].callGetProperty(intObj)), " 字面量 "), intObj));
String var3 = "a";
var1[5].callStatic(Main.class, var1[6].call(var1[7].call(var1[8].call("intObj = \"a\" 执行后 Class type", var1[9].callGetProperty(var3)), " 字面量 "), var3));
}
//...
}
在多线程的情况下,同学请考虑如下情况的引起的实际引用对象问题:
class Main {
public static void main(args) {
def intObj = 2
println "Class type" + intObj.class + " 字面量 " + intObj
new Thread(new Runnable() {
@Override
void run() {
def intObjBackup = intObj
Thread.sleep(200)
println "新线程 intObjBackup Class type" + intObjBackup.class + " 字面量 " + intObjBackup
println "新线程 intObj Class type" + intObj.class + " 字面量 " + intObj
}
}).start()
Thread.sleep(100)
intObj = "a"
println "intObj = \"a\" 执行后 Class type" + intObj.class + " 字面量 " + intObj
}
}
输出:
Class typeclass java.lang.Integer 字面量 2
intObj = "a" 执行后 Class typeclass java.lang.String 字面量 a
新线程 intObjBackup Class typeclass java.lang.Integer 字面量 2
新线程 intObj Class typeclass java.lang.String 字面量 a
类型转化更高的容错
- 我们知道在
java
中float
字面量类型无法直接赋值给int
类型(可以截断强转).
但在groovy
中可以省去强转的语法声明(如果你用def
声明变量请注意他将自动转化变化类型)。
class Main {
public static void main(args) {
int intObj = 2
//赋值一个float类型给int
intObj = 23.1f
println "intObj = 23.1f 执行后 Class type" + intObj.class + " 字面量 " + intObj
//直接把字符串ascii码赋值给int类型,当然如果你这里字符串长度大于1就会出错。如"ava"
intObj ="a"
println "intObj =a 执行后 Class type" + intObj.class + " 字面量 " + intObj
}
}
输出
intObj = 23.1f 执行后 Class typeclass java.lang.Integer 字面量 23
intObj =a 执行后 Class typeclass java.lang.Integer 字面量 97
更智能的布尔判断
在C
语言中Int
可以直接透过是否大于0
返回一个boolean
结果,在groovy
也是可以的。
- 变量为
null
默认返回false
class Main {
public static void main(args) {
def str = "hello"
println "str 不为空"
if (str) {
println "true"
} else {
println "false"
}
println "----------"
println "----------"
println "----------"
str = null
println "str 为空"
if (str) {
println "true"
} else {
println "false"
}
}
}
str 不为空
true
----------
----------
----------
str 为空
false
- 字符串长度为空返回
false
class Main {
public static void main(args) {
def str = ""
println "str 字符串为空"
if (str) {
println "true"
} else {
println "false"
}
}
}
str 字符串为空
false
- 数值类型等于
0
返回false
class Main {
public static void main(args) {
int intObj =0
println "intObj 等于0"
if (intObj) {
println "true"
} else {
println "false"
}
}
}
输出
intObj 等于0
false
当然上面的判断都是依靠asBoolean
函数判断的
class Main {
public static void main(args) {
int intObj =0
println "intObj 等于0"
if (intObj.asBoolean()) {
println "true"
} else {
println "false"
}
}
}
类型转化
类型转化采用as
语法.
class Main {
public static void main(args) {
int intObj = 1
def newTypeOne = intObj as boolean
def newTypeTwo = intObj as char
def newTypeThree = intObj as float
println "${newTypeOne}"
println "${newTypeTwo}"
println "${newTypeThree}"
}
}
函数的定义
函数可以不必要声明返回值,以及参数类型,可以使用def
关键字定义函数,也可以忽略def
class Main {
//使用def定义函数
def static log(one) {
return "hello$one"
}
//不需要加def前缀也可以定义函数
static log2(one) {
return "hello2222$one"
}
public static void main(args) {
def s = log("he")
def s2 = log2("he")
printf "$s $s2"
}
}
上一篇: 使用JSON模式进行JSON验证
下一篇: Groovy-2.基本语法