Gradle学习之闭包

Gradle中的闭包其实就等同于Groovy中闭包,Groovy是一种jvm语言,语法兼容于java,曾几何时,也在脚本语言中独树一帜,初学Gradle的时候,大家很容易被其语法所迷惑,由于Gradle基本上是基于闭包以及委托实现的,所以要学Gradle必须先学Groovy闭包

一.Groovy中的闭包(Closures)

1.闭包是一种匿名的代码块,这个代码块可以有参数及返回值,同时也可以被定义成变量,在Groovy中闭包是一个对象,我们可以简单的把它理解成将方法赋值给一个变量

2.定义闭包的语法结构:{ [闭包参数 ->] 语句 },闭包参数可以是一个或者多个,可以定义参数类型也可以不定义其类型, 例子:

{ item++ }
{ -> item++ }
{ println it }
{ it -> println it }
{ name -> println name }
{ String x, int y ->
  println "hey ${x} the value is ${y}"
}
{ reader ->
  def line = reader.readLine()
  line.trim()
}

3.当闭包参数唯一时,我们可以用it来代替该参数,注意在闭包内不要再次定义it类型变量避免引起冲突
4.闭包也可以作为一个返回值付给一个变量,比如:

def listener = { e -> println "Clicked on $e.source" } 

如果我们不用def来定义,那么使用Groovy中groovy.lang.Closure来代表闭包类型

Closure callback = { println ‘Done!‘ } 

5.调用闭包方法: 闭包名([参数 ...]) 或者 闭包名.call([参数 ...])

def test = { num -> println(num * 2) }
test(2)

6.可以使用闭包来实现接口:

def x ={Object [] args ->} as 接口名

二。闭包中的委托策略

1.在闭包中我们有三个引用对象的关键字:this,owner,delegete,委托策略是指:在闭包中写的属性或者方法,默认绑定到哪个对象上

2.三种关键字说明:

  this:代表闭包的外部类

  owner:默认情况与this相似,但是ownner可以代表类,也可以代表闭包对象

  delegete:默认情况等同于owner,但是我们可以动态改变这个值让闭包内的属性和方法代表不同的意义


3.我们可以用闭包对象的resolveStrategy 来改变代理策略,常见的值
  Closure.OWNER_FIRST:默认策略,如果闭包里的属性或者方法优先调用owner中的,如果owner不存在则调用delegete中的
  Closure.DELEGATE_FIRST 属性或方法优先使用delegete中,如果不存在,则使用owner中的
  Closure.OWNER_ONLY 属性或方法仅仅在owner里寻找,delegete中存在的将被忽略
  Closure.DELEGATE_ONLY 属性或方法仅仅在delegete里寻找,delegete中存在的将被忽略

新建Groovy脚本,代码如下:

package com.bdqn.gradle.study

/**
 * Groovy委托策略演示
* @author chen.nie
* @date 2018/1/16
**/
class GroovyTest {
    def name
    def age

    def getName() {
        return name
    }

    void setName(name) {
        this.name = name
    }

    def getAge() {

        return age
    }

    void setAge(age) {
        this.age = age
    }
    /**
     * 闭包 this owner delegate 的相同情况下演示
     * @return
     */
    def testClosure1() {
        def closure1 = {
            //  test = "20"
            println owner
            println this
            println delegate
        }

        closure1.call()
    }
    /**
     * 嵌套闭包时 this owner delegate区别演示
     * 注意:此时this代表了类
     * 而owner代表了闭包对象
     */
    def testClosure2() {
        def closure2 = {
            def test = {
                println this
                println owner
                println delegate
            }
            test()
        }
        closure2()
    }

    /**
     * 代理对象演示,注意在闭包内定义的date属性如果不指定其代理一定会报错,因为owner中没有date属性
     * @return
     */
    def testClosure3() {
        def closure3 = {
            def test = {
                date = "2018-01-16"
                println(date)
            }
            test()
        }
        GroovyTest1 groovyTest1 = new GroovyTest1()
        closure3.delegate = groovyTest1
        closure3()
    }
}

class GroovyTest1 {
    def name
    def date

    def getName() {
        return name
    }

    void setName(name) {
        this.name = name
    }

    def getDate() {
        return date
    }

    void setDate(date) {
        this.date = date
    }
}

def test = new GroovyTest()
test.testClosure1()
println()
test.testClosure2()
println()
test.testClosure3()

输出结果:

[email protected]
[email protected]
[email protected]

[email protected]
[email protected]
[email protected]

2018-01-16

三 groovy常用特有语法总结:

1. groovy本身就支持java语法,groovy文件最终将会被翻译成.class文件

2. 定义变量或者方法

def name
def test(args){

}//方法可以省略返回值,参数可以省略类型

3.定义多行字符串

def ab="""
         字符串
        """    

4).对象安全操作 对象名?.属性名 当对象为null时直接返回Null

5.定义集合

def items=[4,5]
def list=[1,2,3,*items]

6) 定义map:

def m1 = [c:3,d:4]
def map= [a:1,*:m1]

7) 定义范围:

def range= 0..5 (包含5)
def range1= 0..<5 (不包含5)
def list = [0,1,2,3,4]
assert list[2] == 2
list[2] = 4
assert list[0..2] == [0,1,4]
list[0..2] = [6,6,6]
assert list == [6,6,6,3,4] 

8) 定义方法参数的默认值

def test(a=10){
  //....
}

9) 创建对象指定参数

def person = new Person(age:10,name:"张三")

原文地址:https://www.cnblogs.com/niechen/p/8279864.html

时间: 2024-10-05 00:12:32

Gradle学习之闭包的相关文章

Gradle学习系列之一——Gradle快速入门

Gradle学习系列之一--Gradle快速入门 这是一个关于Gradle的学习系列,其中包含以下文章: Gradle快速入门 创建Task的多种方法 读懂Gradle语法 增量式构建 自定义Property 使用java Plugin 依赖管理 构建多个Project 自定义Task类型 自定义Plugin 请通过以下方式下载本系列文章的Github示例代码: git clone https://github.com/davenkin/gradle-learning.git 和Maven一样,

Gradle学习(一)

安装 Gradle需要jdk1.5以上的安装环境,Gradle装配了自己的Groovy库,所以无需安装Groovy,配置GRADLE_HOME以及PATH gradle -v 测试安装成功与否 Project与Task 每一个Gradle的配置都是由一个或多个Project组成,Project的含义取决于你用Gradle来做什么,一个Project可能代表一个Jar library 或者一个web应用或者一个zip压缩包,一个Project并不一定代表一个即将被构建的项目, 也可能代表一个已经被

Gradle学习(四) web工程构建

Gradle为应用开发提供了两个相关的插件:war plugin以及jetty plugin war plugin继承了java plugin为你的工程构建war包,jetty pugin继承了war plugin可以让的工程构建在嵌入式容器jetty中 构建War文件 首先在你的build.gradle中添加如下一行 apply plugin: 'war' 由于war plugin继承了java plugin,所有java plugin也会被默认的加入配置文件中 运行gradle build命

lua学习之闭包实现原理

感觉学习lua的过程中, 闭包的概念比较难以理解,这里记录下对闭包的学习. 闭包的概念 在Lua中,闭包(closure)是由一个函数和该函数会访问到的非局部变量(或者是upvalue)组成的,其中非局部变量(non-local variable)是指不是在局部作用范围内定义的一个变量,但同时又不是一个全局变量,主要应用在嵌套函数和匿名函数里,因此若一个闭包没有会访问的非局部变量,那么它就是通常说的函数.也就是说,在Lua中,函数是闭包一种特殊情况.在Lua中,函数是一种第一类型值(First-

通过示例学习JavaScript闭包

译者按: 在上一篇博客,我们通过实现一个计数器,了解了如何使用闭包(Closure)**,这篇博客将提供一些代码示例,帮助大家理解闭包. 原文: JavaScript Closures for Dummies 译者: Fundebug 为了保证可读性,本文采用意译而非直译.另外,本文版权归原作者所有,翻译仅用于学习. 闭包并不神奇 其实,只要你领会了闭包的关键概念,一切就非常简单了.作为JavaScript开发者,你应该可以理解以下代码: Example 1 function sayHello(

Gradle学习目录总结

如果是你想干的事情,在别人看起来可能是很难的一件事,不过你自己很喜欢,你不会觉得很苦.我开始创业那会是28岁.对我来讲,我创业的目的不是为了自己当老板,我希望有一个平台有一个环境,我可以控制一些资源,让我去创造一个新的产品和服务: -- 周鸿祎 Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的领域特定(DSL)语言. 当然,我们现在最多都是在Android Studio的项目中,和我一样没有接触过的就

gradle学习总结,偷窥android studio的底裤

原文来自微凉一季的博客http://jijiaxin89.com/2015/08/29/gradle-use-note/ 用过android studio的对gradle应该都不陌生了,gradle文件的基本配置大同小异,略做了解使用应该是没什么问题了.但是深入细致的了解一下对于理解项目还是很有帮助的,尤其是遇到一些配置复杂的github项目,不了解gradle可能会遇到跑不起来又束手无策的情形.下面对gradle相关知识.用法做一下总结. DSL (domain specific langua

Gradle学习系列之一——Gradle快速入门(转)

这是一个关于Gradle的学习系列,其中包含以下文章: Gradle快速入门 创建Task的多种方法 读懂Gradle语法 增量式构建 自定义Property 使用java Plugin 依赖管理 构建多个Project 自定义Task类型 自定义Plugin 请通过以下方式下载本系列文章的Github示例代码: git clone https://github.com/davenkin/gradle-learning.git 和Maven一样,Gradle只是提供了构建项目的一个框架,真正起作

【转载】Gradle学习 第六章:构建脚本基础

转载地址:http://ask.android-studio.org/?/article/11 6.1. Projects and tasks 项目和任务Everything in Gradle sits on top of two basic concepts: projects and tasks.<翻译> Gradle中的所有东西都是围绕两个基本概念:项目和任务. Every Gradle build is made up of one or more projects. What a