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()

输出结果:

com.bdqn.gradle.study.GroovyTest@23f7d05d
com.bdqn.gradle.study.GroovyTest@23f7d05d
com.bdqn.gradle.study.GroovyTest@23f7d05d com.bdqn.gradle.study.GroovyTest@23f7d05d
com.bdqn.gradle.study.GroovyTest$_testClosure2_closure2@2a32de6c
com.bdqn.gradle.study.GroovyTest$_testClosure2_closure2@2a32de6c 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:"张三")

Gradle学习之闭包的更多相关文章

  1. Gradle学习

    Gradle是一种构建工具,它抛弃了基于XML的构建脚本,取而代之的是采用一种基于Groovy的内部领域特定语言.近期,Gradle获得了极大的关注,这也是我决定去研究Gradle的原因. 这篇文章是 ...

  2. Gradle学习总结——抓重点学Gradle

    前言 网上关于Gradle的教程很多,但很多都是以"面"切入- 通过大量讲解其用法及其API分类来阐述.但Gradle API使用技巧众多,API更是成千上百,臣妾记不住呀.个人深 ...

  3. Gradle学习系列之八——构建多个Project

    在本系列的上篇文章中,我们讲到了Gradle的依赖管理,在本篇文章中,我们将讲到如何构建多个Project. 请通过以下方式下载本系列文章的Github示例代码: git clone https:// ...

  4. [转载]学习Javascript闭包(Closure)

    学习Javascript闭包(Closure)     源地址: http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures ...

  5. Gradle中的闭包

    Gradle是基于Groovy的DSL基础上的构建工具,Gradle中的闭包,其原型上实际上即Groovy中闭包.而在表现形式上,其实,Gradle更多的是以约定和基于约定基础上的配置去展现.但本质上 ...

  6. 通过示例学习JavaScript闭包

    译者按: 在上一篇博客,我们通过实现一个计数器,了解了如何使用闭包(Closure),这篇博客将提供一些代码示例,帮助大家理解闭包. 原文: JavaScript Closures for Dummi ...

  7. Gradle学习总结

    Gradle学习系列 (1). Gradle快速入门 (2). 创建Task的多种方法 (3). 读懂Gradle语法 (4). 增量式构建 (5). 自定义Property (6). 使用java ...

  8. Gradle 学习资料

    Gradle 学习资料 网址 Gradle 使用指南 http://wiki.jikexueyuan.com/project/gradle/ 寄Android开发Gradle你需要知道的知识 http ...

  9. Gradle学习系列之三——读懂Gradle语法

    在本系列的上篇文章中,我们讲到了创建Task的多种方法,在本篇文章中,我们将学习如何读懂Gradle. 请通过以下方式下载本系列文章的Github示例代码: git clone https://git ...

随机推荐

  1. zookeeper提示Unable to read additional data from server sessionid 0x

    配置zookeeper集群,一开始配置了两台机器server.1和server.2. 配置参数,在zoo.cfg中指定了整个zookeeper集群的server编号.地址和端口: server.1=1 ...

  2. JAVA_SE基础——65.StringBuffer类 ②

    字符串特点:字符串是常量:它们的值在创建之后不能更改.    字符串的内容一旦发生了变化,那么马上会创建一个新 的对象.    注意: 字符串的内容不适宜频繁修改,因为一旦修改马上就会创建一个新的对象 ...

  3. 进军ABP第一天:ABP理论知识

    1.2.3 领域层领域层就是业务层,是一个项目的核心,所有业务规则都应该在领域层实现. ( 实体(Entity ) 实体代表业务领域的数据和操作,在实践中,通过用来映射成数据库表. ( 仓储(Repo ...

  4. WPF treeview扩展

    记录一下工作中遇到的问题,以便以后忘记了可以来看. 在工作中遇到一个问题,就是要实现类型如下的界面,没有使用Telerik和Dev库.本来最开始是想使用Datagrid,但不知道怎么实现treevie ...

  5. Hey,man,are you ok? -- 关于心跳、故障监测、lease机制

    电话之于短信.微信的一个很大的不同点在于,前者更加及时,有更快速直接的反馈:而后面两个虽然称之为instant message,但经常时发出去了就得等对方回复,等多久是不确定的.打电话能明确知道对方在 ...

  6. ssl双向认证

    ssl双向认证 一.背景知识 1.名词解释 ca.key: 根证书的私钥 , ca.crt: 根证书的签名证书 server.key, server.crt client.key, client.cr ...

  7. 英语词汇(2)fall down,fall off和fall over

    一.fall down,fall off和fall over都表示"摔倒.跌倒"的意思,但它们各自的含义不同. 1.fall over 落在...之上, 脸朝下跌倒 fall ov ...

  8. tk mybatis通用mapper,复杂and or条件查询

    需求:where查询,需要支持(a or b or c) and d 也就是a.b.c三个条件是或的关系,然后再与d相与. 尝试后,可以通过以下方式处理: 方式1:Weekend语法 Weekend& ...

  9. geotrellis使用(三十七)COG 基础介绍

    前言 Geotrellis 已经迭代到了 2.0 版本(截止写作此文时为 2.0.0-SNAPSHOT 版),2.0 版多了很多新的特性,其中最重要的应该就是 COG,COG 是什么鬼?刚看到时我也是 ...

  10. 控件篇:CheckedListBox的全选与反选

    private void cbXmlAll_CheckedChanged(object sender, EventArgs e) { for (int i = 0; i < cblXmlList ...