Gradle系列第(一)篇---Groovy语法初探

版权声明:本文为LooperJing原创文章,转载请注明出处!

一、从Java到Groovy的关系

Groovy能直接接受你的Java代码,也就是说在Groovy中写java代码也是可以的,因为Groovy 是一门JVM 语言,也就是,Groovy 的代码最终也会被编译成JVM 字节码,交给虚拟机去执行,我们也可以直接反编译这些字节码文件。从一段你很熟悉的代码开始,在循环中打印三遍hello java。

    public  void  printHello() {
        for (int i = 0; i < 3; i++) {
            System.out.println("hello java");
        }
    }

那么改成Groovy语言改如何写呢?其实有多种写法。
a、第一种

    for  ( i  in  0..2 ) {
        println("hello Groovy")
     }

b、第二种

   3.times {
        println("hello Groovy")
    }

c、第三种

   0.upto(2) {
        println("hello Groovy")
    }

d、第四种

    List list = ["hello Groovy", "hello  Groovy", "hello  Groovy"]
    list.each {element->
        println(element)
    }

上面四种方法的输出结果都是 hello Groovy ,groovy 的方法调用是可以没有括号的,而且也不需要分号结尾。可以见到相对java来说,Groovy语言要稍微简洁一点,但是现在看起来可能有点蒙逼了。下面简单地说一下 groovy 一些语法。

二、Groovy语法

1、变量

有两类可以在生成脚本中声明的变量: 局部变量和额外属性。 在groovy 中,没有固定的类型,局部变量是用def关键字声明的。它们只在定义它们的范围内可以被访问,比如:

def name = 'Jerry'

变量定义时,也可以直接指定类型,比如

def  int x = 1   

我们通过单引号引用一串字符串的时候这个字符串只是单纯的字符串,内容严格对应Java中的String,不对$符号进行转义,但是如果使用双引号引用,在字符串里面还支持插值操作,如果字符中有$号的话,则它会对$表达式先求值。

def name1 = 'Jerry'
def name2="Lisa ,$name1" //name2实际就是Lisa,Jerry

上面属于局部变量,再看看额外属性,Gradle 的域模型中,所有增强的对象都可以容纳用户定义的额外的属性。这包括但并不限于项目(project)、任务(task)和源码集(source set)。额外的属性可以通过所属对象的ext属性进行添加,读取和设置。或者,可以使用ext块同时添加多个属性。比如:

task myTask{
    ext.myProperty="value"
}

这表示为myTask创建了一个名字为myProperty属性,值是value

2、方法

类似 python 一样,通过def关键字定义一个方法。无类型的函数定义,必须使用def关键字,方法如果不指定返回值,默认返回最后一行代码的值。

def getNum(def num) {
    num * num
}

//如果指定了函数返回类型,则可不必加def关键字来定义函数
int  getNum(def num){
     num * num
}

getNum(2)的返回值就是4, 函数定义时,参数的类型也可以不指定。比如

def getNum(num) {
    num * num
}

上面每一行代码都不需要加上分号,除了每行代码不用加分号外,Groovy中函数调用的时候还可以不加括号。比如:

println("test") ---> println "test"

虽然对于函数调用可以不带括号,但是Groovy经常把属性和函数调用混淆。所以我觉得加上更好。

3、类
class People{
    List hobby=['swim','play','watch TV']
    String name="Jerry"
      int  getAge(){
        return 20
    }
}

在Groovy 中,默认所有的类和方法都是pulic的,所有类的字段都是private的;和java一样,我们通过new关键字得到类的实例,使用def接受对象的引用:def people = new People(),而且在类中声明的字段都默认会生成对应的setter,getter方法。所以我们可以people.getName()来取值,也可以使用people.name来取值,同时我们可以使用people.setName ‘Lisa ,注意,groovy 的方法调用是可以没有括号的,而且也不需要分号结尾。除此之外,我们也可以直接调用;

4、数据类型

Groovy的数据类型主要有三大类,一个是Java中的基本数据类型,一个是Groovy中的容器类,还有一个非常重要的是闭包。

a、基本数据类型
Groovy世界中的所有事物都是对象。所以int,boolean这些Java中的基本数据类型,在Groovy代码中其实对应的是它们的包装数据类型。比如int对应为Integer,boolean对应为Boolean。

b、Groovy中的容器类

  • List:链表,其底层对应Java中的List接口,一般用ArrayList作为真正的实现类。
  • Map:键-值表,其底层对应Java中的LinkedHashMap。
  • Range:范围,它其实是List的一种拓展。

在 Groovy 中,定义一个列表是这样的:

List list = [1, 2, 3, 4, 5]
list[2]=100
println list.size 

assert list[2] == 7 //获取下标为2的值
assert list instanceof java.util.List //类型为java.util.List
def list2 = new ArrayList<String>(list1) //创建新集合
def list3 = ['a', 1, 'a', 'a', 2.5, 2.5f, 2.5d, 'hello', 7g, null, 9 as byte] //可以不同类型,并且可以重复,可以为null

如何定义一个Map呢?

def mymap = ['key1':'value1','key2':true] 

map的取值是这样

mymap.key1   或者mymap[key1]  

Range是Groovy对List的一种拓展,变量定义和大体的使用方法如下:

def range = 1..5  

实际上包括 1,2,3,4,5这五个值,这在上面的循环中已经用到过。又比如:

def range = 5..8;  //创建左右包含的Rangerange = 5..<8; //不包含8,小于8

c、闭包(Closure)

闭包(Closure)是一种强大的数据类型,对闭包比较书面的一种解释“闭包是可以用作函数参数和方法参数的代码块”。其实Groovy的闭包更象是一个“代码块”或者方法指针,代码在某处被定义然后在其后的调用处执行。简单点说就是代表了一段可执行的代码。其外形如下:

def xxx = {paramters -> code}  //或者  
def xxx = {无参数,纯code}  这种情况不需要->符号

比如这就是很简单的闭包:

def myClosure={
    println("Hello")
}

调用方式:myClosure()

接受参数的闭包:

def myClosure={String str->
    println(str)
}
调用方式:myClosure("Hello")

接受多个参数的闭包:

def myClosure={String str,int num->
    println("$str  ,$num ")
}
调用方式:myClosure("Hello",20)

闭包里面的参数类型可以省略不写:

def myClosure={ str, num->
    println("$str  ,$num ")
}
调用方式:myClosure("Hello",20)

如果闭包没定义参数的话,则隐含有一个参数,这个参数名字叫it,和this的作用类似。it代表闭包的参数:

def list = [1,2,3,4,5]  //定义一个List
list.each{  //调用它的each函数
      println it
}

闭包在Groovy中大量使用,比如很多类都定义了一些函数,这些函数最后一个参数都是一个闭包,闭包有点回调函数的感觉。
最后:GroovyAPI:http://www.groovy-lang.org/api.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,590评论 18 139
  • 什么是 Groovy? 简言之,Groovy是一种基于JVM(Java虚拟机)的敏捷动态开发语言。它是一种成熟的面...
    北纬26阅读 4,117评论 0 14
  • Groovy :是一种动态语言。 1:这种语言比较有特点,它和 Java 一样,也运行于 Java 虚拟机中。简单...
    PeytonWu阅读 1,543评论 0 1
  • groovy是什么 Groovy 是下一代的Java语言,跟java一样,它也运行在 JVM 中。 作为跑在JVM...
    ronaldo18阅读 671评论 0 4
  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,139评论 9 118