Gradle02-Gradle用户所需要了解的Groovy

一、groovy介绍
  A multi-faceted language for the Java platform
  Apache Groovy is a powerful, optionally typed and dynamic language, with static-typing and staticcompilation capabilities, for the Java platform aimed at improving developer productivity thanks to a concise, famillar and easy to learn syntax. It integrates smoothly with any Java program, and immediatelydelivers to your application powerful features, including scripting capabilities,Domain-Specific Languageauthoring, runtime and compile-time meta-programming and functional programming.
二、比较java和groovy语法

  1. 在groovy可以编写更少代码的同时更高效地工作.
package edu.uestc.tiger

public class ProjectVersion{
    private Integer major;
    private Integer minor;

    public ProjectVersion(Integer major ,Integer minor){
        this.major - major;
        this.minor = minor;
    }
    // setter and getter
}

A、Groovy为你所编写的类假定了合理的默认值

  1. 表达式后面的;是可选的
  2. 每个类,构造器和方法默认是public的
  3. 方法体中最后一个表达式的值会被作为返回值(return语句是可选的)
  4. 自动添加setterlgetter方法
  5. 类的属性可以通过.号来获取,在底层(调用的是setter/getter)
  6. ==比较两个实例,调用的是equals方法,不会有空指针NullPointerException异常

B、高效特性:
  1.assert语句(java也支持)
  2.可选类型定义
  3.可选的括号(方法调用)
  4.字符串(jdk新版本也支持该特性)

 '':单纯字符串

def str1 = "this is a single-quoted string' 

  "":可插值到表达式或变量中

def str = "$str1";

  """""":字符串可换行

def str2 = """select
    title,author,price,publisher
    form book
    where id = ?
"""

三、集合API
  Groovy为集合API的实现提供了简洁的语法,使得其比java中类似的使用更加方便。

  List:默认的类型就是ArrayList;集合元素可以接收任意的数据类型

def builTools = ["Ant', "Maven']

assert builTools.getClass() == java.util.ArrayList
assert builTools.size() = 2
assert builTools[1] == 'Maven'

//向列表末尾添加一个元素Gradle
bullTools << 'Gradle'

assert builTools.size() = 3
assert builTools[2] = "Gradle'

buildTools.each{buildTool ->
printin buildTool}

  假如我想定义一个inkedList集合,我该如何去指定一个集合的类型呢?

  • 通过as关键字来指定。def list = [1, 2, 3] as LinkedList
  • 通过强类型来定义你想要的类型。LinkedList list1=[4, 5, 6]

  Map:默认实现是java.lang.LinkedHashMap

def inceptionYears = ['Ant' : 2000, 'Maven' :2004]

println inceptionYears.getClass()
inceptionYears['Gradle'] = 2008

assert inceptionYears.size() == 3
//访问map中的元素(根据特定的key获取value)
println inceptionYears.Ant
println inceptionYears ["Ant"]

inceptionYears.each {key,value -> println "$key was first released in $value"}

四、命名参数
  ProjectVersion类暴露了一个构造器来初始化其中的属性。假设你没有定义构造器。Groovy提供了一样更加方便的方式来设置属性值——命名参数

class ProjectVersion{
    Integer major
    Integer minor
}

def verson = new ProjectVersion(mayor: 1,minor: 10)
assert version.minor == 10;
version.minor = 30;
assert version.minor == 30

五、闭包
  闭包是一个类型为grovy.lang .Closure的代码块,和lambda表达式特性类似。闭包可以赋值给变量,作为参数传递给方法,并且可以像普通方法一样来调用

  隐式的闭包参数
  每个没有显式定义任何参数的闭包都可以访问一个隐式的参数t. it代表调用这个闭包的时候第一个传递进来的参数。如果没有提供参数,那么参数的值就是null.

def incrementMajorProjectVersion{
    it.major++
}

def projectVersion = new ProjectVersion(major: 1, minor: 10)

incrementMajorProjectVersion( projectVersion)
assert projectVersion.major == 2

  显式的闭包参数

  除了使用隐式的闭包参数,也可以使用更具描述性的参数名。

def incrementMajorProjectVersion {
    def projectVersion ->
    projectVersion.major++
 }

def projectVersion = new ProjectVersion(major: 1, minor: 10)

incrementMajorProjectVers: ion( projectVersion)
assert projectVersion.major = 2

  定义多个无类型参数的闭包

def incrementMajorProjectVersion = {version,major ,minor ->
    version.major = major
    version.minor = minor
}

def projectVersion - new Projectversion(major:1, minor:10)
incrementMajorProjectversion( projectVersion,2,1)
assert projectversion.major == 2
assert projectversion .minor == 1

  闭包返回值
  闭包总是会返回一个值。返回值是闭包的最后一条语句的值 (如果没有显式的retun语句) ,或者是可执行的retum语句的值。如果闭包的最后一条语句没有值, 就返回null.

def projectVersion = new ProjectVersion(major: 1, minor: 10)
def minorVersion = {projectVersion.minor}
assert minorVersion() == 10

  闭包作为方法参数

Integer incrementVersion(Closur closure , Integer count){
  closure() + count
}
def projectVersion = new ProjectVersion(major: 1, minor: 10)
assert incrementVersion(projectVersion.minor,2) == 12

  闭包委托
  闭包代码在委托的闭包上执。默认的,这个委托就是闭包的所有者。比如,如果你在Groovy脚本中定义了一个闭包。 那么所有者就是一 个groovy.lang.Script实例。 包的隐式变量delegate分许你重新定义默认的所有者。如下代码设置了委托给ProjectVersion实例, 这意味着所有闭包都在这个实例上执行。

class Projectversionf
  Integer major
  Integer minor
  void increment(Closure closure){//用闭包作为参数
    closure.resolveStrategy = closure.DELEGATE_ONLY //只处理委托引用
    closure.delegate = this //设置闭包委托
    closure()
  } }

def project = new ProjectVersion(major: 1, minor: 10)
project.increment{ major += 1}
assert project.major == 2

六、在Gradle构建脚本中使用Groovy
在大多数情况下,在构建脚本中调用的属性和方法都自动委托给org.gradle. apl.Project实例

apply plugin: 'java' //调用Project的apply方法,关于参数,提供一个只有一个键值对的Map,方法调用省略括号

version = '0.1' //通过调用Project的setter方法为项目设置版本属性

repositorier{//调用Project的repositories方法并传递- 个闭包    
  mavenCentral()
//调用闭包委托的mavenCentral()方法 } dependencies { //调用Project的dependencies方法,并传递一个闭包参数   compile "commons-codec:1.6" //调用闭包委托的对象的compile方法,用一个String作为参数,方法调用省略了括号 }

 

posted @ 2021-04-13 13:21  Tiger-Adan  阅读(171)  评论(0编辑  收藏  举报