小言_互联网的博客

【Gradle】Groovy的语法详解(上篇)

219人阅读  评论(0)

Gradle之所以在项目构建的过程中很强大,其中很大一部分原因就是在于Groovy。Grooovy是Java平台上设计的一种强大的、可选类型和动态的语言。Groovy可以无缝地集成任何Java程序,并立即让你的应用程序拥有强大的特性,包括脚本功能、DSL、运行时和编译时元编程和函数式编程。

也就是说,相比较于通过Maven等来进行项目构建,它可以更灵活多变地实现更加复杂的功能。

本文实例源码github地址https://github.com/yngzMiao/yngzmiao-blogs/tree/master/2020Q1/20200108


哪里书写gradle脚本

Gradle支持多Project的构建。多Project构建的结构包括:

  • 项目的根目录下包含一个settings.gradle文件
  • 项目的根目录下包含一个build.gradle文件
  • 项目的子目录下包含自己的build.gradle文件
    settings.gradle文件的作用是告诉Gradle,项目和子项目是如何组织的。它是在Gradle构建的初始化阶段被执行的。如果仅单个项目,该文件可以省略。

build.gradle文件的作用是定义项目的具体内容和task的具体内容,因此也被称为构建脚本。它是在Gradle构建的配置/执行阶段被执行的


Groovy

Groovy的特点

Groovy语言的特点:

  • 基于Java虚拟机的一种灵活而动态的语言,可以无缝集成所有的Java类和库
  • 既可以用于面向对象编程,又可以用作纯粹的脚本语言
  • 具有Python、Ruby和Smalltalk等动态语言中的特性(如动态类型转换、闭包和元编程)
  • 支持DSL和其它紧凑的语法,使得代码易于阅读和维护。

Groovy的下载与安装

需要注意的是,由于Gradle附带了自己的Groovy库,因此如果已经安装了Gradle,就不需要安装Groovy

Groovy SDK的下载地址:The Apache Groovy programming language

这里介绍一下如何安装Groovy的二进制发行版(Windows):

  • 下载并解压Groovy的二进制发行版
  • 设置GROOVY_HOME环境变量的值为解压的目录
  • 添加GROOVY_HOME/bin路径到PATH环境变量中
  • 设置JAVA_HOME环境变量的值为JDK的目录
    安装完毕之后可以通过groovy –version命令来验证是否安装成功。如果安装成功,那么命令行将输出Groovy的版本号。

当然,如果是Linux操作系统的话,只需要在~/.bashrc文件中export下groovy可执行文件的位置即可。


Groovy语法

由于Groovy是一门语言,从头学习的话也需要好多章节,本博文就对其中经常需要用到的知识点进行一些梳理。如果是和Java比较类似的语法,本博文就不做阐述了

其次,本博文采用的是在build.gradle文件中进行书写,直接运行.gradlew文件即可进行编译和运行

Hello World

之前提到,Groovvy可以无缝集成所有的Java类和库,既可以用于面向对象编程,又可以用作纯粹的脚本语言。这也就提供了类方式脚本方式两种方式来编写Hello World程序。

类方式:所谓类方式,就是采用Java程序的编写方式。如:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

脚本方式:就是不需要按照类的这种较臃肿的方式进行编写,可以采用轻便紧凑的方式进行。如:

System.out.println("Hello World!");

为了体现出Groovy构建项目的灵活性、快捷性,本文建议使用脚本方式进行编写。

可能你觉得打印的语句还不够精简,其实Groovy提供了更加方便快捷的写法:

System.out.println("Hello World!");
println("Hello World!");                    //省略前缀
println "Hello World!";                     //省略括号
println "Hello World!"                      //省略分号

Groovy省略规则

上面的例子可以看出,使用Groovy有时候可以省略很多东西,那么究竟Groovy可以省略什么东西呢?是不是在任意情况下都可以省略呢?

可选的括号:如果方法调用至少有一个参数并且没有歧义,那么可以省略括号。例如:

println "Hello World"

但是,如果方法调用没有参数或者有歧义,那么需要圆括号。例如:

println()                       //不能写成println
println(Math.max(5, 10))        //不能写成println Math.max 5, 10

可选的分号:如果一行代码仅包含一条语句,那么在该行末尾的分号可以省略;一行代码中的多个语句需要分号来分隔它们。

可选的类型定义:Groovy中的变量可以省略类型定义。例如:

int x = 1
int y = 2

等同于下面这个脚本:

x = 1
y = 2

可选的return关键字:在Groovy中,一个方法或者闭包的最后一个表达式的值被返回。因此,return关键字是可选的。例如:

int add(int a, int b) {
    return a+b
}
println add(1, 2)

可以简化为:

int add(int a, int b) {
    a+b
}
println add(1, 2)

可选的public关键字默认情况下,Groovy的类和方法都是public的。例如:

class Server {
    String toString() { 
        "a server" 
    }
}

等同于下面这个类:

public class Server {
    public String toString() { 
        "a server" 
    }
}

变量定义与使用

Groovy支持可选类型。变量可以使用它们的具体类型或者def关键字来定义,当然,上文也提到Groovy可以省略类型定义。不过,博主建议使用def进行定义。

字符串

Groovy的字符串支持单引号双引号三引号的定义方式。

单引号字符串和三引号字符串的区别在于:单引号无格式,三引号有格式。这一点和python的语法类似。例如:

def s1 = 'hello world'
def s2 = '''hello

world'''

println s1
println s2

此时的输出为:

yngzmiao@yngzmiao-virtual-machine:~/test/test$ ./gradlew 
hello world
hello

world

那双引号字符串相较于单引号字符串,增加了插值扩展表达式的功能。插值是将字符串中的占位符替换为字符串的值,占位符表达式使用${..}来代表。如果没有插值表达式,那么双引号字符串是普通的java.lang.String。反之,如果有插值表达式,那么双引号字符串是groovy.lang.GString。可以使用class属性来查看类型,或者使用instanceof表达式检验类型。例如:

def s1 = 'hello world'
def s2 = ">>> ${s1}"

println s2

此时的输出为:

yngzmiao@yngzmiao-virtual-machine:~/test/test$ ./gradlew 
>>> hello world

定义了字符串,就可以使用Groovy的一些对字符串操作的函数了,当然,Java中本身对于字符串的操作依旧有效。例如:

def s1 = 'hello'
def s2 = 'hello world'
def s3 = '34'

s1.class                  //查看类型
s1 instanceof String      //判断类型
s1.compareTo(s2)          //字符串比较
s1 > s2                   //字符串比较
s1.charAt(1)              //提取字符
s1[2]                     //切片提取字符
s1[2..4]                  //切片提取字符,包含结束
s2.substring(1, 8)        //截取字符串,不包含结束
s2.minus(s1)              //字符串中去除子串
s2 - s1                   //字符串中去除子串
s2.replace(s1, s3)        //字符串代替
s2.indexOf(s1, 0)         //字符串查找
s1.reverse()              //字符串反转
s3.isNumber()             //字符串是否为数字
s3.toInteger()            //字符串转数字

列表

Groovy使用逗号分隔的值列表,用方括号括起来表示列表。Groovy列表的类型是java.util.List,默认情况下,具体实现类是 java.util.ArrayList。例如:

def numbers = [1, 2, 3]

numbers.class                   //查看类型
numbers instanceof List         //判断类型
numbers.get(2)                  //按索引获取元素
numbers.size()                  //获取列表长度
numbers << 4                    //添加元素
numbers.add(1, 5)               //按索引添加元素
numbers.remove(1)               //按索引删除元素
numbers.set(1, 5)               //按索引修改元素
numbers.contains(5)             //判断元素是否存在
numbers.indexOf(5)              //查找元素第一次出现位置
numbers.lastIndexOf(5)          //查找元素最后一次出现位置

提示一下,Groovy支持创建包含不同类型的值的列表。

Map

在Groovy中,初始化Map时,将键和值用冒号分隔开来,每个键/值对用逗号分隔开来,并且全部的键和值用方括号括起来。默认情况下,定义Map使用的具体实现类是 java.util.LinkedHashMap。例如:

def colors = [red: '#FF0000', green: '#00FF00', blue: '#0000FF']

colors.class                        //查看类型
colors instanceof java.util.LinkedHashMap       //判断类型
colors['red']                       //按key获取元素,存在可修改,不存在可添加
colors.red                          //按key获取元素,存在可修改,不存在可添加
colors.get('red')                   //按key获取元素,存在可修改,不存在可添加
colors.remove("red")                //按key删除元素
colors.containsKey("red")           //判断key是否存在
colors.size()                       //获取map的长度
colors.keySet()                     //获取map的key集合
colors.entrySet()                   //获取map的键值对集合
colors.values()                     //获取map的value集合

闭包

闭包是Groovy中的一个很重要的概念,由于篇幅问题,该部分内容留到下篇博文中进行介绍。

方法定义与使用

在Groovy中,方法定义有一个返回值类型,或者使用def关键字以使返回值无类型。方法还可以接收任意数量的参数,这些参数可以不显式声明它们的类型。Java的修饰符可以正常使用,如果没有提供修饰符,那么该方法是public的。

同时上文提到,如果Groovy中的方法需要返回值,但并没有提供返回语句,那么将返回执行的最后一行中的值。例如:

def fun(person, age) {
  if(age > 18)
    println "hello adult ${person}"
  else
    println "hello child ${person}"
}

fun('zhangsan', 17)
fun('lisi', 19)

相关阅读


转载:https://blog.csdn.net/qq_38410730/article/details/103787129
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场