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

一.Groovy中的闭包(Closures)

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

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

  1. { item++ }
  2. { -> item++ }
  3. { println it }
  4. { it -> println it }
  5. { name -> println name }
  6. { String x, int y ->
  7.   println "hey ${x} the value is ${y}"
  8. }
  9. { reader ->
  10.   def line = reader.readLine()
  11.   line.trim()
  12. }

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

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

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

  1. Closure callback = { println 'Done!' }

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

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

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

  1. 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脚本,代码如下:

  1. package com.bdqn.gradle.study
  2.  
  3. /**
  4. * Groovy委托策略演示
  5. * @author chen.nie
  6. * @date 2018/1/16
  7. **/
  8. class GroovyTest {
  9. def name
  10. def age
  11.  
  12. def getName() {
  13. return name
  14. }
  15.  
  16. void setName(name) {
  17. this.name = name
  18. }
  19.  
  20. def getAge() {
  21.  
  22. return age
  23. }
  24.  
  25. void setAge(age) {
  26. this.age = age
  27. }
  28. /**
  29. * 闭包 this owner delegate 的相同情况下演示
  30. * @return
  31. */
  32. def testClosure1() {
  33. def closure1 = {
  34. // test = "20"
  35. println owner
  36. println this
  37. println delegate
  38. }
  39.  
  40. closure1.call()
  41. }
  42. /**
  43. * 嵌套闭包时 this owner delegate区别演示
  44. * 注意:此时this代表了类
  45. * 而owner代表了闭包对象
  46. */
  47. def testClosure2() {
  48. def closure2 = {
  49. def test = {
  50. println this
  51. println owner
  52. println delegate
  53. }
  54. test()
  55. }
  56. closure2()
  57. }
  58.  
  59. /**
  60. * 代理对象演示,注意在闭包内定义的date属性如果不指定其代理一定会报错,因为owner中没有date属性
  61. * @return
  62. */
  63. def testClosure3() {
  64. def closure3 = {
  65. def test = {
  66. date = "2018-01-16"
  67. println(date)
  68. }
  69. test()
  70. }
  71. GroovyTest1 groovyTest1 = new GroovyTest1()
  72. closure3.delegate = groovyTest1
  73. closure3()
  74. }
  75. }
  76.  
  77. class GroovyTest1 {
  78. def name
  79. def date
  80.  
  81. def getName() {
  82. return name
  83. }
  84.  
  85. void setName(name) {
  86. this.name = name
  87. }
  88.  
  89. def getDate() {
  90. return date
  91. }
  92.  
  93. void setDate(date) {
  94. this.date = date
  95. }
  96. }
  97.  
  98. def test = new GroovyTest()
  99. test.testClosure1()
  100. println()
  101. test.testClosure2()
  102. println()
  103. test.testClosure3()

输出结果:

  1. com.bdqn.gradle.study.GroovyTest@23f7d05d
  2. com.bdqn.gradle.study.GroovyTest@23f7d05d
  3. com.bdqn.gradle.study.GroovyTest@23f7d05d
  4.  
  5. com.bdqn.gradle.study.GroovyTest@23f7d05d
  6. com.bdqn.gradle.study.GroovyTest$_testClosure2_closure2@2a32de6c
  7. com.bdqn.gradle.study.GroovyTest$_testClosure2_closure2@2a32de6c
  8.  
  9. 2018-01-16

三 groovy常用特有语法总结:

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

2. 定义变量或者方法

  1. def name
  2. def test(args){
  3.  
  4. }//方法可以省略返回值,参数可以省略类型

3.定义多行字符串

  1. def ab="""
  2. 字符串
  3. """

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

5.定义集合

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

6) 定义map:

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

7) 定义范围:

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

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

  1. def test(a=10){
  2. //....
  3. }

9) 创建对象指定参数

  1. 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. Linux 目录与文件管理

    1. 目录与路径1.1 相对路径与绝对路径1.2 目录的相关操作: cd, pwd, mkdir, rmdir1.3 关于执行文件路径的变量: $PATH2. 档案与目录管理2.1 档案与目录的检视: ...

  2. JFinal项目发送邮件——jfinal-mail-plugin

    JFianl框架: JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java语言所有 ...

  3. nyoj水池数目

    水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地 ...

  4. vue组件详解(四)——使用slot分发内容

    一.什么是slot 在使用组件时,我们常常要像这样组合它们: <app> <app-header></app-header> <app-footer>& ...

  5. C#微信公众号——消息处理

    ​当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL. 一.接收POST请求,处理XML信息 public void ProcessRequest(HttpC ...

  6. SQL 中的日期和时间类型

    在我们SQL中一般支持三种数据类型. date:日历日期,包括年(四位),月和日. time: 一天中的时间,包括小时,分和秒.可以用变量time(p)来表示秒的小数点后的数字位数(默认是0). 通过 ...

  7. Python基础(函数-递归)

    本章内容: 深浅拷贝 函数(全局与局部变量) 内置函数 文件处理 三元运算 lambda 表达式 递归(斐波那契数列) 冒泡排序 深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝 ...

  8. javascript学习总结一

    1. 变量提升hoisting 变量提升的意思是在一个变量作用域里定义的变量的声明会被提升到作用域的顶部,这是变量只会被声明,不会被初始化复制,而是undefined. 代码如下: function ...

  9. linux文件访问权限(像rw-r--rw-是什么意思)

    Linux的文件访问权限分为 读.写.执行三种 r:可读(4) w:可写(2)对目录来说则可新建文件 x:可执行(1)对目录来说则可进入该目录 可用 ls -l 查看文件 像上图的-rw-r--rw- ...

  10. (CLR-Via-C#) 类型基础

    CLR要求每个类型最终都派生自System.Object Object提供的公共方法: Equals: 如果两个对象具有相同的值,就返回true GetHashCode: 返回对象的哈希码 ToStr ...