Gradle从0入门到实战系列【二】Groovy And Gradle

简介: 要学好Gradle,我们需要简单的学习Groovy的基础语法和闭包。Groovy 是一种基于 JVM 的动态语言,他的语法和 Java 相似,最终也是要编译 .class 在JVM上运行。Groovy 完全兼容 Java 并且在此基础上添加了很多动态类型和灵活的特性,比如支持闭包,支持DSL(领域特定语言),是一门非常灵活的动态脚本语言。
关注我,这里有你意想不到的惊喜

数据类型

在Groovy中,数据类型有:

  • Java中的基本数据类型
  • Java中的对象
  • Closure(闭包)
  • 加强的List、Map等集合类型
  • 加强的File、Stream等IO类型

标识符&方法

def 是 Groovy 用来定义标识符关键字

// 定义一个字符串变量 domain 它的值为 君哥聊编程
def domain = "君哥聊编程";

//定义一个整数,a会自动被推导为整数类型
def a = 1;

//也可以指定具体类型
def int c = 1;

// 定义一个方法 buildString,接收两个字符串参数,返回它们拼接的结果
def buildString(String a, String b){
    println "$a-$b"
}

// 结尾的分号可以省略
def result = buildString('hello' , 'it235')

总结

  • 在Groovy中,类型是弱化的,所有的类型都可以动态推断,但是Groovy仍然是强类型的语言,类型不匹配仍然会报错
  • Groovy中的注释和Java中相同

字符串

Groovy 中提供了三种表示 String 的方法:单引号(’),双引号(")或三引号(’’’)括起来。

  • 单引号括起来的字符串没有运算能力,表示普通字符串
  • 双引号表示的字符串可以使用取值运算符${},而$在单引号只只是表示一个普通的字符
  • 三引号表示的字符串又称为模版字符串,可以跨越多行,它可以保留文本的换行和缩进格式,三引号同样不支持$

    def stringTest() {
      def strA = '单引号'
        def strB = "双引号"
        def strC = '''
    ---三引号---
    '''
      println strA
      println strB
      println strC
      println '单引号==$strB'
      println "双引号==$strB"
      println '''三引号==$strC'''
    }
    输出结果
    单引号
    双引号
    
    ---三引号---
    
    单引号==$strB
    双引号==双引号
    三引号==$strC

方法

  • 括号可省略:调用方法的时候,可以省略括号,如 #2

    def methodTest(){
        buildString("君哥","牛皮") // #1
        buildString "君哥","牛皮" // #2
    }
    
    def buildString(String a, String b){
        println "$a-$b"
    }
    methodTest()
    
    输出结果:
    君哥-牛皮
    君哥-牛皮
    
  • return 可不写: 方法中没有写 return 语句,则方法执行过程中的最后一句代码的值作为返回值

    def methodTest(){
        def result = chooseSmallNum 1,10
        println result
    }
    
    def chooseSmallNum(int a, int b){
        if (a <= b) {
            a
        }else {
            b
        }
    }
    
    methodTest()
    
    输出结果:
    1
  • Groovy支持动态类型推导,使用def来定义变量和方法时可以不指定变量的类型和方法的返回值类型,同时定义方法时参数可以不指定类型

    def num1 = 1
    def num2 = 2
    def result = add(num1, num2)
    
    def add(a, b){
        return a + b
    }

运算符与逻辑控制

运算符与Java基本保持一致
  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 位运算符
  • 赋值运算符

逻辑控制

  • 分支

    // if条件语句
    def age = 28
    if (age >= 30) {
        println("${age}岁,不小了,该找女票了")
    } else {
        println("还小呢,继续玩,才${age}岁")
    }
    
    //if-else-if
    def age = 28
    if (age >= 30) {
        println("${age}岁,不小了,该找女票了")
    } else if (age < 28 && age > 22) {
        println("还小呢,继续玩,才${age}岁")
    }else {
        println("${age}尴尬的年纪")
    }
    
    //swtich switch支持集合、支持闭包、支持正则
    
    def x = 1.23
    def result = ""
    switch ( x ) {
      case "foo":
          result = "found foo"
          // lets fall through
      case "bar":
          result += "bar"
      case [4, 5, 6, 'inList']:
          result = "list"
          break
      case 12..30:
          result = "range"
          break
      case Integer:
          result = "integer"
          break
      case Number:
          result = "number"
          break
      case ~/fo*/: // toString() representation of x matches the pattern?
          result = "foo regex"
          break
      case { it < 0 }: // or { x < 0 }
          result = "negative"
          break
      default:
          result = "default"
    }
  • 循环

    //0 1 2 3 4
    for(i = 0; i < 5; i++){
      print i + ' '
    }
    
    //0 1 2 3 4 5
    for(i in 0..5){
      print i + ' '
    }
    //0 1 2 3 4
    for(i in 0..<5){
      print i + ' '
    }
    
    //0 1 2 3 4 
    5.times{
      print it + ' '
    }
    
    //5 6 7 8 9 10 
    5.upto(10){
      print it + ' '
    }
    
    //5 4 3 2
    5.downto(2){
      print it + ' '
    }
    
    //5 8 11 14
    5.step(17,3){
      print it + ' '
    }
    
    //5 3 1 -1 -3
    5.step(-4,-2){
      print it + ' '
    }
    

Bean

  • Groovy会为类中每个没有可见性修饰符的字段生成getter/setter方法,我们访问这个字段其实是调用它的getter/setter方法。
  • 同时只要写了 getter/setter 方法,也一样可以作为属性进行访问。
  • 对于没有定义的属性,如果只写了 getter 方法,那不可以修改该属性的值,如例子中的 age 属性;
class Person{
  def name
  private def country
  
  def setNation(nation){
      this.country = nation
  }
  def getNation(){
      return country
  }
  public int getAge(){24}
    
  public String getInfo(){
    "$country-$name-$age"
  }
}

def person = new Person()
//访问属性
person.name = '君哥'
println person.name

//像字段一样访问这个以get/set开头的方法
person.nation = "china"
println person.nation

//访问的是info的get方法
println person.info

输出结果:
君哥
china
china-君哥-24

Collection

对于 List 来说,Groovy 提供下标索引的方式进行访问,值得注意的是,除了普通的下标索引,还有负下标索引和范围索引的方式

def listTest(){
  def nameList = ["it235","君哥","Groovy","Java","Kotlin","js","Gradle"]
  println nameList[0] // 正数第一个
  println nameList[1] // 正数第二个
  println nameList[-2] // 倒数第二个
  println nameList[-1] // 倒数第一个
  println nameList[0..2] // 正数第一个到第三个
  println nameList[-1..1] // 倒数第一个到正数第二个,倒着打印
}

输出结果
it235
君哥
js
Gradle
[it235, 君哥, Groovy]
[Gradle, js, Kotlin, Java, Groovy, 君哥]

Map在gradle中用得非常多,如:plugins中、dependencies中,map所有key默认都是string类型的。

//空Map声明
def mapNull = [:];
println mapNull.size();//0

def map = [
        iPhone : 'iWebOS',
        Android: '2.3.3',
        Nokia  : 'Symbian',
        Windows: 'WM8'
]

println map instanceof HashMap

if(map.containsKey('Windows')){
    println(map.Windows) 
    println(map['Windows'])
    println map.get("Windows","default value")
}

// Print the values
map.each{ k, v -> println "${k}:${v}" }

for ( e in map ) {
    print "key:${e.key},value:${e.value}"
}

输出结果:
0
true
WM8
WM8
WM8
iPhone:iWebOS
Android:2.3.3
Nokia:Symbian
Windows:WM8
key:iPhone,value:iWebOSkey:Android,value:2.3.3key:Nokia,value:Symbiankey:Windows,value:WM8

闭包 Closure

闭包是Groovy中非常重要的一个数据类型,是由大括号括起来的一段可执行的代码,可以接受参数也可以有返回值。

  • 闭包语义{ [closureParameters -> ] statements }
    其中[closureParameters->]代表参数列表,多参数用逗号分割,用->隔开参数与内容,没有参数可以不写->
  • 示例

    //一段简单的输出代码块
    {println "Hello Gradle"}
    
    //闭包只有一个参数的时候,默认就是 it,无需申明
    {println it}
    
    //即使申明了it也不影响程序
    {it -> println it}
    
    //将上述申明的it换成name,程序依然能读取到
    {name -> println name}
    
    //多个参数且指定参数类型的闭包
    {String a ,int b -> println "key:$a ,value:$b"}
    
    //多个参数未指定类型的闭包
    {k,v -> println "$k-$v"}
  • groovy.lang.ClosureAPI
    每个定义的闭包是一个Closure对象,所以我们可以把一个闭包赋值给一个变量

    //接收简单类型的闭包对象
    def simpleClosure = {
      println "Hello Gradle"
    }
    
    //接收带一个参数的闭包对象
    def itClosure = {
      it -> println it
    }
    
    //接收带多个参数的闭包对象,且包含返回值
    def paramClosure = {
        k,v -> println "$k-$v"
        return "hello closure"
    }
  • 执行闭包
    行闭包对象有两种,一是直接用括号+参数,二是调用call方法

    • 闭包对象(参数)
    • 闭包对象.call(参数)
    simpleClosure()
    simpleClosure.call()
    
    itClosure("默认1个参数的闭包")
    itClosure.call("默认1个参数的闭包")
    
    def resultA = paramClosure("hello" , "world")
    def resultB = paramClosure.call("hello" , "world")
    
  • 复杂一点的调用

    //闭包体作为参数传入,操作单个属性
    def simpleCall(closure){
        def value = "Hello Groovy"
        closure(value)
    }
    
    //作为参数传入
    simpleCall({print it})
    
    //去掉()的简写
    simpleCall{
        print it
    }
    
    //map遍历操作
    def mapEach(closureTemp){
        def map = ["君哥","it235.com","Gradle":"Groovy"]
        map.each {
          closureTemp(it.key,it.value)
        }
    }
    
    //调用mapEach方法,mapEach的参数就是闭包
    mapEach { 
        k,v ->
        // 闭包不只一个参数的时候,需要把参数一一列出
          println "$k-$v"
    }
    // 方法 listEach 只有一个参数,用于接收一个闭包参数
    def listEach(closureTemp){
        def nameList = ["君哥","it235.com","Groovy","Java","Kotlin"]
        nameList.each {
          closureTemp(it)
        }
    }
    
    // listEach 的参数是闭包
    listEach {
        // 闭包只有一个参数的时候,默认就是 it
        println it
    }

代码块可作为参数传递:代码块就是闭包,通俗来说就是一段被大括号包裹起来的代码

// Closure 定义闭包
def doSomething(String a, String b, Closure method){
    method.call(a,b)
}

//方式1:初始写法,比较繁琐
doSomething("君哥聊编程","it235.com",{a,b -> println "$a-$b"})

//方式2:Groovy 规定如果方法的最后一个参数是闭包,可以放到方法后面
doSomething("君哥聊编程","it235.com"){ a,b ->
    println "$a-$b"
}
//方式3:括号可以省略,最常见的写法
doSomething "君哥聊编程","it235.com",{ a,b ->
    println "$a-$b"
}

总结

本篇到这里就结束了,带大家认识和学习了groovy语法基础,用好gradle的前提是我们需要掌握Groovy基础语法,有了这一篇的知识,下一篇我们就来学习Gradle提供的内部API,循序渐进的成为大佬,有疑问可以在评论区留言讨论

目录
相关文章
|
7月前
|
XML Java 测试技术
Gradle安装部署与基础入门详解
Gradle安装部署与基础入门详解
802 0
|
7月前
|
Java 程序员 API
Gradle笔记 二 Gradle的基础Groovy
Gradle笔记 二 Gradle的基础Groovy
83 0
|
7月前
|
XML 缓存 Java
Gradle 构建自动化工具入门
Gradle 构建自动化工具入门
|
Java 测试技术 Scala
[√]groovy / gradle学习
[√]groovy / gradle学习
66 0
|
Java Shell 数据处理
Android 根目录下和应用目录下的build.gradle的详解,以及groovy语法的讲解
Android 根目录下和应用目录下的build.gradle的详解,以及groovy语法的讲解
241 0
|
XML Java Apache
Gradle极简入门
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,而不是传统的XML。Gradle构建脚本是用Groovy编写的,也可以使用Kotlin编写,两者都是基于JVM的语言。
347 0
|
Java 编译器 API
Gradle筑基篇(五)-Gradle自定义插件实战
前面几篇文章笔者对Gradle的一些基础认知,groovy基础语法,以及Gradle 项目中常用的一些api进行了讲解。今天笔者再来讲解一些关于`Gradle插件`的使用
|
XML JSON JavaScript
Gradle筑基篇(二)-groovy语法详解
大家回想一下自己第一次接触`Gradle`是什么时候? 相信大家也都是和我一样,在我们打开第一个AS项目的时候, 发现有很多带gradle字样的文件:`setting.gradle, build.gradle,gradle.warpper`,以及在`gradle`文件中各种配置, 这些都是啥wy啊。
|
Java 测试技术 程序员
|
XML 存储 缓存