zoukankan      html  css  js  c++  java
  • 《Gradle权威指南》--Groovy基础

    No1:

    Groovy中分号不是必须的

    No2:

    Groovy中,单引号和双引号都可以定义一个字符串常量,不同的是单引号标记的是纯粹的字符串常量,而不是对字符串里的表达式做运算,但是双引号可以。

    task printStringClass<<{
        def str1='单引号'
        def str2="双引号"
        
        println "单引号定义的字符串类型:"+str1.getClass().name
        println "双引号定义的字符串类型:"+str2.getClass().name
    }
    
    task printStringVar<<{
        def name = "张三"
        println '单引号的变量计算:${name}'
        println "双引号的变量计算:${name}"
    }

    结果

    No3:

    List

    task printList<<{
        def numList=[1,2,3,4,5,6]
        println numList.getClass().name
        
        println numList[1]//访问第二个元素
        println numList[-1]//访问最后一个元素
        println numList[-2]//访问倒数第二个元素
        println numList[1..3]//访问第二个到第四个元素
        
        numList.each{
            println it
        }
    }

     结果

    No4:

    Map

    task printlnMap<<{
        def map1=['width':1024,'height':768]
        println map1.getClass().name
        
        println map1['width']
        println map1.height
        
        map1.each{
            println "key:${it.key},Value:${it.value}"
        }
    }

     结果

    No5:

    方法括号可省略

    task invokeMethod<<{
        method1(1,2)
        method1 1,2
    }
    
    def method1(int a,int b){
        println a+b
    }

    结果

    No6:

    return可以不写,默认执行最后一句

    task printMethodReturn<<{
        def add1 = method2 1,2
        def add2 = method2 5,3
        println "add1:${add1},add2:${add2}"
    }
    
    def method2(int a,int b){
        if(a>b){
            a
        }else{
            b
        }
    }

    结果

    No7:

    代码块

    代码块形成过程
    //第一步
    numList.each({
        println it
    })
    //第二步
    numList.each(){
        println it
    }
    //第三步
    numList.each{
        println it
    }

    No8:

    JavaBean

    task helloJavaBean<<{
        Person p = new Person()
        println "名字是:${p.name}"
        p.name = "张三"
        println "名字是:${p.name}"
        println "年龄是:${p.age}"
    }
    
    class Person{
        private String name
        public int getAge(){
            12
        }
    }

    结果

    注意:能取到age的值是因为定义了getAge()方法,但不能修改age的值,因为没有定义setter方法

    No9:

    闭包

    task helloClosure<<{
        //使用我们自定义的闭包
        customEach{
            println it
        }
    }
    
    def customEach(closure){
        //模拟一个有10个元素的集合,开始迭代
        for(int i in 1..10){
            closure(i)
        }
    }

    结果

    当闭包有一个参数时,默认就是it

    多个参数如下

    task helloClosure<<{
        //多个参数
        eachMap{k,v->
            println "${k} is ${v}"
        }
    }
    
    def eachMap(closure){
        def map1 = ["name":"张三","age":18]
        map1.each{
            closure(it.key,it.value)
        }
    }

    结果

    No10:

    Groovy闭包有thisObject、owner、delegate三个属性

    task helloDelegate<<{
        new Delegate().test{
            println "thisObject:${thisObject.getClass()}"
            println "owner:${owner.getClass()}"
            println "delegate:${delegate.getClass()}"
            method1()
            it.method1()
        }
    }
    
    def method1(){
        println "Context this:${this.getClass()} in root"
        println "method1 in root"
    }
    class Delegate{
        def method1(){
            println "Delegate this:${this.getClass()} in Delegate"
            println "method1 in Delegate"
        }
        def test(Closure<Delegate> closure){
            closure(this)
        }
    }

    结果

    注:delegate和owner是相等的。优先级:thisObject>owner>delegate?

    task configClosure<<{
        person{
            personName="张三"
            personAge=20
            dumpPerson()
        }
    }
    
    class Person{
        String personName
        int personAge
        def dumpPerson(){
            println "name is ${personName},age is ${personAge}"
        }
    }
    
    def person(Closure<Person> closure){
        Person p = new Person();
        closure.delegate = p
        //委托模式优先
        closure.setResolveStrategy(Closure.DELEGATE_FIRST);
        closure(p)
    }

    结果

  • 相关阅读:
    C++复制构造函数,类型转换构造函数,析构函数,引用,指针常量和常量指针
    POJ1611(The Suspects)--简单并查集
    最小生成树-Kruskal算法
    POJ1861(Network)-Kruskal
    POJ1979(Red and Black)--FloodFill
    [转]全网最!详!细!tarjan算法讲解
    POJ1573(Robot Motion)--简单模拟+简单dfs
    最小生成树-Prim算法
    POJ3368(Frequent values)--线段树
    POJ3255(Roadblocks)--次短路径
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/8582867.html
Copyright © 2011-2022 走看看