Groovy.md

Groovy入门

目录:

简介

Groovy是一个通用的、面向对象的、基于JVM(Java虚拟机)的编程语言,编译成Java二进制代码。

官网

http://www.groovy-lang.org/

下载

http://www.groovy-lang.org/download.html

w3cschool的Groovy教程

https://www.w3cschool.cn/groovy/groovy_environment.html

安装和使用

安装:

使用:

简单例子

String a='Groovy'
println 'hello'
println 'hello';
println ('hello')
println 'hello,${a}'
println "hello,${a}"

结果:
hello
hello
hello
hello,${a}
hello,Groovy

注:

Groovy中会自动导入以下包:

基本数据类型

Groovy中没有原始类型,所有的变量都使用包装类,如java.lang.Integer、java.lang.Character、java.lang.Double等。

内置的数据类型整数的文法,是Integer类型,如1、2、3等。

内置的数据类型浮点数的文法,是java.math.BigDecimal类型,如1.2等。

String a='Groovy'
println "hello,${a}"
println "hello,$a"
Date b=new Date()
println b
def c=1
c='hi'
println c

结果:
hello,Groovy
hello,Groovy
Sat May 26 00:05:33 CST 2018
hi

注:

assert方法和Groovy真值

Groovy的assert方法是根据Groovy真值来评估参数的:

例子

assert 1                 //正数,是真
//assert 0                 //0,会抛出异常
assert -1                //负数,是真
assert 'a'               //字符串,是真
assert !0                //是真
assert !''               //是真
assert !""               //是真
assert ![]               //是真
assert 1==1              //Boolean类型,且为true,是真
assert 10==2+1+3+4+1     //Boolean类型,为false,会抛出异常

通过的断言不返回任何东西,失败的断言会抛出一个异常,还包含大量的调试信息。

如上面的assert 10==2+1+3+4+1,是Boolean类型,但为false,所以会抛出异常,且会输出以下详细的调试信息:

Exception thrown

Assertion failed: 

assert 10==2+1+3+4+1     //Boolean类型,为false,会抛出异常
         |  | | | |
         |  3 6 | 11
         false  10


	at ConsoleScript21.run(ConsoleScript21:10)

操作符重载

在Groovy中,每个操作符都对应一个方法的调用,如+加号调用Number的plus方法、*乘号调用Number的multiply方法、**则表示求幂操作符、==调用的是equals方法,检查的是相等性、is方法用来检查引用。

assert 1+2==1.plus(2)
assert 2-1==2.minus(1)
assert 1*2==1.multiply(2)
assert 2/1==2.div(1)
assert 'Groovy'*2=='GroovyGroovy'
assert 2**4==16
Integer a=1
Integer b=a
assert a.is(b)

结果:
都为真,无输出

集合

使用方括号,并用逗号分隔,可以创建一个ArrayList,可以使用as操作符来转换一个集合的类型,此外,集合也有操作符重载,实现方法如plus、minus等。

def a=[1,2,3]
assert a instanceof ArrayList
Set b=a as Set
assert b==[1,2,3] as Set
assert b instanceof Set

assert a[0..2]==[1,2,3]
assert a[-1..-3]==[3,2,1]                    //从末尾向前调用
assert a[-1..1]==[3,2]					   //也是从末尾向前调用

String c='Groovy'
assert 'yvoorG'==c[-1..0]                    //字符串也是集合

def map=[a:1,b:2]
assert map.getClass()==LinkedHashMap
assert map.a==1                               //重载的点号是put方法
assert map['a']==1                            //使用putAt方法
assert map.get('a')==1                       //java方式

结果:
都为真,无输出

注:

闭包

闭包就像java中的lambda,接受一个参数并解析一块代码,Groovy闭包可以修改在其之外定义的变量。

Groovy中有一个Closure类,代表一块代码。

Groovy中的很多方法都使用闭包作为参数,如集合each方法,它的每个元素都是一个闭包,不过是一同被解析的。

在闭包中修改一个闭包外定义的变量不是一个好方法。

def a=[1,2,3]
def b=[]                  //空数例
a.each{ n->               //each接受一个单参数的闭包
    b << n*2              //左移操作符在集合中追加元素
}
assert b==[2,4,6]

以上例子是一个列表值乘二的操作,不过更推荐用以下方法来实现,我们可以用闭包collect方法来将一个集合转换到一个新集合中。

--------------------例子(1)-----------------------
def a=[1,2,3]
def b=a.collect{ it*2 }
assert b==[2,4,6]

--------------------例子(2)------------------------
def a=[1,2,3]
def b=a.collect{ n->
    n*2
}
assert b==[2,4,6]

注:

POGOs

Java中只包含属性和getters,setters通常被称为POJOs(Plain Old Java Objects),而在Groovy中也有类似的类,被称为POGOs(Plain Old Groovy Objects)。

import groovy.transform.Canonical
@Canonical
class Event{
    String a
}

Event e=new Event(a:'hello')
Event e1=new Event(a:'hello')
println e						//结果为Event(hello)
println e.toString()			 //结果为Event(hello)
Set s=[e,e1,1,2]                  //因为e和e1相等,所以在s中e和e1被当作只有一个。
println s.size()				 //结果为3

注:

Gradle构建文件中的Groovy

Gradle构建文件支持所有的Groovy语法。

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
}

task clean(type:Delete){
    delete rootProject.buildDir
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    //implementation fileTree(dir: 'libs', include: ['*.jar'])
}

注: