Gradle自动化项目构建技术-2.Groovy核心语法讲解

栏目: Groovy · 发布时间: 6年前

内容简介:groovy变量类型都是对象类型的,基本类型都会被编译器转换成对象类型运行结果:

Gradle自动化项目构建技术-2.Groovy核心语法讲解

groovy变量类型都是对象类型的,基本类型都会被编译器转换成对象类型

int x = 10
println x.class

double y = 3.14
println y.class

运行结果:

class java.lang.Integer
class java.lang.Double

弱类型def定义方式,可以动态转换为其他类型

def x1 = 10
println x1.class

def y1 = 3.14
println y1.class

def z1 = "hello"
println z1.class

x1 = "shijiacheng"
println x1.class

运行结果:

class java.lang.Integer
class java.math.BigDecimal
class java.lang.String
class java.lang.String

什么时候使用强类型,什么时候弱类型

  • 如果我们自己使用的时候,可以使用弱类型
  • 如果我们定义的类要被其他类使用的话,建议使用强类型,这样就会固定参数的类型,防止类型转换的时候出错。

Groovy字符串详解

Gradle自动化项目构建技术-2.Groovy核心语法讲解
  • 单引号定义字符串

    def name = 'a single string'
    println name.class
    
    // 转义字符
    def name2 = 'a single \'a\' string'
    println name2.class
    

    运行结果:

    class java.lang.String
    class java.lang.String
    
  • 三引号定义字符串

    def name3 = '''three sigle string'''
    println name3
    println name3.class
    
    // 三引号可以自定带格式的字符串
    def name4 = '''line1
    line2
    line3'''
    println name4
    

    运行结果:

    three sigle string
    class java.lang.String
    line1
    line2
    line3
    
  • 双引号定义字符串

    // 双引号定义普通字符串和单引号一样,都是java.lang.String类
    def name5 = "hello world"
    println name5
    println name5.class
    
    // 双引号还可以定义字符串表达式,这个时候返回的就不是java.lang.String类了
    def name6 = "2 and 3 equals = ${2 + 3}"
    println name6
    println name6.class
    

    运行结果:

    hello world
    class java.lang.String
    2 and 3 equals = 5
    class org.codehaus.groovy.runtime.GStringImpl
    
  • java.lang.String和GStringImpl相互转换是编译器帮我们做好的,我们可以任意转换这两种类型

    String echo(String message){
        return message
    }
    def result = echo(name6)
    println result
    println result.class
    

    运行结果:

    2 and 3 equals = 5
    class java.lang.String
    

####

字符串方法

Gradle自动化项目构建技术-2.Groovy核心语法讲解
  • 字符串填充

    def str = "hello groovy"
    //中间填充
    println str.center(15,'&')
    // 左边填充
    println str.padLeft(15,'a')
    

    运行结果:

    &hello groovy&&
    aaahello groovy
    
  • 字符串比较

    // 字符串比较
    def str2 = "hello"
    println str > str2
    

    运行结果:

    true
    
  • 索引和字符串截取

    // 字符串截取
    println str[0]
    // 截取某一段字符串
    println str[0..1]
    

    运行结果:

    h
    he
    
  • 字符串减法

    //字符串减法
    println str - str2
    

    运行结果:

    groovy
    
  • 其他方法

    //字符串反转
    println str.reverse()
    
    // 首字母大写
    println str.capitalize()
    
    // 判断字符串是不是Int类型
    println str.isNumber()
    
    // 字符串类型转换
    println "123".toInteger()
    

    运行结果:

    yvoorg olleh
    Hello groovy
    false
    123
    

逻辑控制

Gradle自动化项目构建技术-2.Groovy核心语法讲解
  • switch-case语句

    def x = 1.23
    def result = ''
    switch (x){
        case 'foo':
            result = 'foo'
            break
        case [1.23,4,5,6,'inlist']://列表
            result = 'list'
            break
        case 12..30://范围
            result = 'range'
            break
        case Integer:
            result = 'integer'
            break
        case BigDecimal:
            result = 'big decimal'
            break
        default:result = 'default'
    }
    println(result)
    
  • 循环语句

    • 对范围的for循环

      //对范围的for循环
      def sum = 0
      for(i in 0..9){
          sum += i
      }
      println sum
      
    • 对list的循环

      // 对list的循环
      sum = 0
      for (i in [1,2,3,4,5,6,7,8,9]){
          sum += i
      }
      println sum
      
    • 对map的循环

      // 对map的循环
      sum = 0
      for (i in ['lili':1,'lucy':2,'liming':3]){
          sum += i.value
      }
      println sum
      

2.2 闭包

Gradle自动化项目构建技术-2.Groovy核心语法讲解

闭包:就是代码块

  • 闭包的调用,闭包有两种调用方式

    // 有参数的闭包
    def clouser5 = {String name -> return "Hello ${name}!"}
    def result = clouser5('groovy')
    println result
    

    运行结果

    Hello groovy!
    Hello groovy!
    
  • 有参数的闭包

    // 有参数的闭包
    def clouser2 = {String name -> println "Hello ${name}!"}
    clouser2.call('groovy')
    clouser2('groovy')
    
  • 有多个参数的闭包

    // 有多个参数的闭包
    def clouser3 = {String name,int age ->
        println "Hello ${name},My age is ${age}"}
    clouser3.call('groovy',4)
    clouser3('groovy',4)
    
  • 闭包的默认参数

    // 闭包的默认参数
    def clouser4 = { println "Hello ${it}!"}
    clouser4.call('groovy')
    clouser4('groovy')
    
  • 闭包的返回值

    // 闭包返回值
    def clouser5 = {String name -> return "Hello ${name}!"}
    def result = clouser5('groovy')
    println result
    
  • 闭包都有返回值

    //闭包体没有写return的话其实也是有返回值的
    def clouser6 = {String name -> println "Hello ${name}!"}
    def result2 = clouser6('groovy')
    println result2
    

    运行结果:

    Hello groovy!
    null
    

闭包的用法

Gradle自动化项目构建技术-2.Groovy核心语法讲解
  • upto方法

    // 计算指定number的阶乘
    int fab(int number){
        int result = 1
        1.upto(number,{num -> result *= num})
        return result
    }
    
    int x = fab(5)
    println x
    

    查看upto方法的源码

    public static void upto(Number self, Number to, @ClosureParams(FirstParam.class) Closure closure) {
        int self1 = self.intValue();
        int to1 = to.intValue();
        if (self1 > to1) {
            throw new GroovyRuntimeException("The argument (" + to + ") to upto() cannot be less than the value (" + self + ") it's called on.");
        } else {
            for(int i = self1; i <= to1; ++i) {
                closure.call(i);
            }
    
        }
    }
    
  • downto方法

    int fab2(int number){
        int result = 1
        number.downto(1){
            num -> result*=num
        }
        result result
    }
    int y = fab2(5)
    println y
    
  • time方法

    // 计算累加值
    int cal(int number){
        int result = 0
        number.times {
            num -> result += num
        }
        return result
    }
    
    int z = cal(101)
    println z
    

闭包与字符串结合使用

  • each遍历

    String str = 'the 2 and 3 is 5'
    //each遍历
    str.each {
        String temp -> print temp.multiply(2)
    }
    

    运行结果:

    tthhee  22  aanndd  33  iiss  552
    
  • find找到符合条件的第一个

    // find找到符合条件的第一个
    println str.find{
        String s -> s.isNumber()
    }
    

    运行结果:

    2

  • findAll找到所有符合条件的

    // findall 找到所有符合条件
    def list = str.findAll{
        String s -> s.isNumber()
    }
    println list.toList()
    

    运行结果:

    [2, 3, 5]
    
  • any返回str中是否有任意一项符合条件

    // any 返回str中是否有符合条件的任何一项
    def result = str.any {
        String s -> s.isNumber()
    }
    println result
    

    运行结果:

    true
    
  • every 返回str中的每一项是否都符合条件

    // every 返回str的每一项是否都符合条件
    def result2 = str.every {
        String s -> s.isNumber()
    }
    println result2
    

    运行结果:

    false
    
  • 将string转换为list

    // 将string转为list
    def list2 = str.collect {
        it.toUpperCase()
    }
    println list2.toListString()
    

    运行结果:

    [T, H, E,  , 2,  , A, N, D,  , 3,  , I, S,  , 5]
    

闭包进阶讲解

Gradle自动化项目构建技术-2.Groovy核心语法讲解
  • 闭包中的三个重要变量

    /**
     * 闭包的三个重要变量 this,owner,delegate
     */
    def scriptCloser = {
        //代表闭包定义处的类
        println "scriptCloser this:"+this
        // 代表闭包定义处的类或者对象
        println "scriptCloser owner:"+owner
        // 代表任意对象,默认闭包定义处的类
        println "scriptCloser delegate:"+delegate
    }
    
    scriptCloser.call()
    

    运行结果:

    scriptCloser this:variable.closerstudy@649bec2e
    scriptCloser owner:variable.closerstudy@649bec2e
    scriptCloser delegate:variable.closerstudy@649bec2e
    
  • 定义了一个内部类

    //定义了一个内部类
    class Person{
        def static classCloser = {
            println "classCloser this:"+this
            println "classCloser owner:"+owner
            println "classCloser delegate:"+delegate
        }
    
        def static say(){
            def classCloser = {
                println "methodClassCloser this:"+this
                println "methodClassCloser owner:"+owner
                println "methodClassCloser delegate:"+delegate
            }
            classCloser.call()
        }
    }
    
    Person.classCloser.call()
    Person.say()
    

    运行结果:

    classCloser this:class variable.Person
    classCloser owner:class variable.Person
    classCloser delegate:class variable.Person
    methodClassCloser this:class variable.Person
    methodClassCloser owner:class variable.Person
    methodClassCloser delegate:class variable.Person
    
  • 去掉内部类中的静态方法

    //定义了一个内部类
    class Person{
        def classCloser = {
            println "classCloser this:"+this
            println "classCloser owner:"+owner
            println "classCloser delegate:"+delegate
        }
    
        def say(){
            def classCloser = {
                println "methodClassCloser this:"+this
                println "methodClassCloser owner:"+owner
                println "methodClassCloser delegate:"+delegate
            }
            classCloser.call()
        }
    }
    Person p = new Person()
    p.classCloser.call()
    p.say()
    

    运行结果:

    classCloser this:variable.Person@932bc4a
    classCloser owner:variable.Person@932bc4a
    classCloser delegate:variable.Person@932bc4a
    methodClassCloser this:variable.Person@932bc4a
    methodClassCloser owner:variable.Person@932bc4a
    methodClassCloser delegate:variable.Person@932bc4a
    
  • 闭包中定义一个闭包

    // 闭包中定义一个闭包
    def nestCloser = {
        def innerCloser = {
            println "innerClassCloser this:"+this
            println "innerClassCloser owner:"+owner
            println "innerClassCloser delegate:"+delegate
        }
        innerCloser.call()
    }
    nestCloser.call()
    

    运行结果:

    innerClassCloser this:variable.closerstudy@1cbb87f3
    innerClassCloser owner:variable.closerstudy$_run_closure2@3e84448c
    innerClassCloser delegate:variable.closerstudy$_run_closure2@3e84448c
    
  • 修改默认的delegate

    // 闭包中定义一个闭包
    def nestCloser = {
        def innerCloser = {
            println "innerClassCloser this:"+this
            println "innerClassCloser owner:"+owner
            println "innerClassCloser delegate:"+delegate
        }
        innerCloser.delegate = p//修改默认的delegate
        innerCloser.call()
    }
    nestCloser.call()
    

    运行结果:

    innerClassCloser this:variable.closerstudy@22e357dc
    innerClassCloser owner:variable.closerstudy$_run_closure2@63a12c68
    innerClassCloser delegate:variable.Person@446293d
    
  • 闭包的委托策略

    // 闭包的委托策略
    
    class Student{
        String name
        def pretty = {
            "My name is ${name}"
        }
        String toString(){
            pretty.call()
        }
    }
    
    class Teacher{
        String name
    }
    
    def stu = new Student(name:  Sarash )
    def tea = new Teacher(name:  Shijiacheng )
    println stu.toString()
    
    stu.pretty.delegate = tea
    stu.pretty.resolveStrategy = Closure.DELEGATE_ONLY
    println stu.toString()
    

    运行结果:

    My name is Sarash
    My name is Shijiacheng
    

##


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算机程序设计艺术(第3卷)-排序和查找(英文影印版)

计算机程序设计艺术(第3卷)-排序和查找(英文影印版)

(美)Donald E.Knuth / 清华大学出版社 / 2002-9 / 85.00元

《计算机程序设计艺术排序和查找(第3卷)(第2版)》内容简介:这是对第3卷的头一次修订,不仅是对经典计算机排序和查找技术的最全面介绍,而且还对第1卷中的数据结构处理技术作了进一步的扩充,通盘考虑了将大小型数据库和内外存储器。它遴选了一些经过反复检验的计算机方法,并对其效率做了定量分析。第3卷的突出特点是对“最优排序”一节作了修订,对排列论原理与通用散列法作了全新讨论。一起来看看 《计算机程序设计艺术(第3卷)-排序和查找(英文影印版)》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具