欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Groovy 基本语法

程序员文章站 2022-07-12 15:11:09
...

本文将简单讲解Groovy语言相关基础知识,如果你学过其他的类Kotlinswift那么你讲非常轻松了解其语法。关于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

类型转化更高的容错

  • 我们知道在javafloat字面量类型无法直接赋值给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"


    }


}

相关标签: Groovy&Gradle