美文网首页
3 Groovy 代码之谈

3 Groovy 代码之谈

作者: Java_Explorer | 来源:发表于2019-06-01 17:48 被阅读0次

    上一篇用文字介绍了 Groovy 和 Java 的不同和特有的特性,这一篇就用代码来阐述 Groovy 和 Java 的不同以及特有的特性。写代码之前需要来做一些准备工作,准备工作如下:

    1、准备工作

    • 创建 Gradle Java 项目
      IntelliJ IDEA -> File -> new -> project -> Gradle -> Java -> Next -> 写GrounpId, ArtifactId, Version -> 选本地Gradle环境 -> 写项目名 -> Finish
      项目创建完成
    • 打开 Groovy 控制台:Tools -> Groovy Console -> 直接写 Groovy 代码

    有了以上的准备工作就可以来书写 Groovy 代码了,接下咱们就来看下 Groovy 和 Java 的区别。

    2、Groovy 和 Java 的区别

    以下咱们就通过定义 JavaBean 来说明 Groovy 和 Java 的不同之处。

    2.1 Java 定义 JavaBean

    class Student {
        private String name;
        private String email;
        private Integer age;
        // 构造器
        // getter setter...
    }
    

    2.2 Groovy 定义 JavaBean

    class Student {
        private String name
        private String email
        Integer age      // 没权限修饰符会自动生成 getter setter
        private String getName() {
            name        // 可以省略return
        }
        private void setName(String name) {
            this.name = name
        }
        //可省略 getter setter 省略了 email 的 getter setter 
    }
    

    2.3 Groovy 中操作JavaBean

    Groovy 可以做类,也可以做脚本,所以咱们可以在类的后面直接写操作JavaBean 的语句。如下:

    // class Student {...}
    // 外部可直接调用类的私有成员
    Student stu = new Student()
    stu.setName("小明")
    println '私有getter方法:' + stu.getName()
    
    // 使用点的方式操作字段
    stu.email = 'xiao@'
    println '点方式调用:' + stu.email
    
    // 调用自动生成的 getter setter 方法
    stu.setAge(19)
    println '调用自动生成getter,setter:' + stu.getAge()
    
    //  自动生成具名构造器
    Student stu = new Student(name:'willie', age:18)
    //Student stu = [name:'willie', age:18]          // 直接写参数和值赋给对象,会自动设置字段值
    println stu.name + ':' + stu.age + ':' + stu.email
    
    // null 调用方法不报空指针异常
    stu.name = null
    println stu.name.equals('ssss')
    

    2.4 总结 groovy 与 Java 不同

    • JavaBean 的定义
    1. 可省略分号
    2. 可省略 getter/setter
    3. 可省略 return
    4. 无权限修饰符自动生成 getter/setter
    • 直接类外定义对象和调用字段
    1. 可调用私有成员
    2. 可使用点方式调用字段
    3. 无权限修饰会自动生成 getter setter
    4. 自带具名构造器
    • 空值使用不抛出空指针异常

    以上就是 Groovy 和 Java 的比较,接下来咱们来看下 Groovy 的特有语法。

    3、Groovy 的特有语法

    Groovy 特有语法挺多的,以下咱们就挑一些比较特殊的语法来讲解下。

    3.1 基本语法

    • 变量类型定义
      groovy 具有特有的弱类型声明,用 def 来代替所有类型,变量可不写类型。建议带 def,清晰。
    • assert 方法
      使用 assert 方法做断言
    • 方法括号可省略
      方法调用可以省略括号,前提是必须带有参数的方法,不然会认为是属性。
    // 变量声明
    def name = 'willie'
    age = 18
    // 带参数方法调用可省略括号
    println name + ':' + age
    // assert 断言
    assert age == 19
    

    3.2 字符串定义

    字符串的定义有三种方式:

    1. 单引号(' ') :普通字符串定义
    2. 双引号(" ") :内容中可使用 ${} 引用变量值
    3. 三单引号(''' ''') :可按格式引入字符串,字符串可换行
    // 字符串使用 '|"|'''
    def str1 = 'willie'                // 普通字符串定义
    def str2 = "wolfcode:${str1}"      // 字符串内容中可引用变量
    def str3 = '''wolfcode:
        willie'''                      // 可格式化定义字符串
    
    println str1                // willie
    println str2                // wolfcode:willie
    println str3                // wolfcode:
                                //     willie
    

    3.3 集合定义和使用

    所有操作兼容 Java 语法,以下咱们就来看下特有语法。

    List 特有语法

    • 声明:使用 [] 定义集合
    def list = [ele1, ele2, ele3]
    
    • 添加:使用 << 做元素添加
    list << ele4
    
    • 类型:java.util.ArrayList

    Map 特有语法

    • 声明:使用[] key:value 的方式定义
    def map = [key1:value1,key2:value2]
    
    • 添加:使用 .key 赋值方式
    map.key3 = value3
    
    • 类型:java.util.LinkedHashMap
    // list 集合,使用[] 定义集合
    def list = ['willie','will','stef']
    list << 'AA'                // List 元素特有添加方式
    list.add('BB')
    println list                // [willie, will, stef, AA, BB]
    println list.getClass()     // 使用的是 java.util.ArrayList
    println "=========== Map 映射 =============="
    def map = [name:'willie', age:18]
    map.wechat = 'cunge_weixin' // Map 元素特有添加方式
    map.put('aa', 'AA')
    println map                 // [name:willie, age:18, wechat:cunge_weixin, aa:AA]
    println map.getClass()      // 使用的是 java.util.LinkedHashMap
    

    4、闭包

    4.1 闭包介绍

    闭包是 Groovy 的重点知识点,闭包简单理解就是 { } 括起来的代码块。跟方法类似,可带参和不带参。闭包可以赋给一个变量也可以当做参数值传递给一个方法,在方法中调用闭包。

    4.2 闭包的定义格式

    {
        [param1,param2... ->]
        执行体
    }
    

    4.3 闭包调用

    需要使用变量来接收再调用

    def closure = {[param1,param2... ->] 执行体}
    closure([param]) 或 closure.call([param])
    

    4.4 代码展现

    定义带参和不带参闭包,作为方法的参数使用(Gradle 中使用 Groovy 闭包的方式)

    // 不带参闭包
    def c1 = {
        println 'hello'
    }
    // 带参闭包
    def c2 = {
       val ->       // 指定闭包形参名
       println "hello ${val}"
    }
    // 定义指定参数类型方法接收无参闭包
    def method1(Closure closure){
        //closure()
        closure.call()
    }
    // 定义无指定参数类型方法接收带参闭包
    def method2(clo){
        //clo('willie')
        clo.call('willie')
    }
    method1(c1)
    method2(c2)
    

    Groovy 的闭包在 Gradle 中起决定性作用,讲这么久的 Groovy 主要是为了给 Gradle 做铺垫,在每个Gradle 项目中都有一个 build.gradle 文件,此文件就是使用 Groovy 语言定义的项目构建脚本。此文件非常重要。

    下一篇 <<使用Gradle快速构建项目>>

    转载链接:https://www.jianshu.com/p/f6d3521c940c

    相关文章

      网友评论

          本文标题:3 Groovy 代码之谈

          本文链接:https://www.haomeiwen.com/subject/qjsatctx.html