目录:
Groovy是一个通用的、面向对象的、基于JVM(Java虚拟机)的编程语言,编译成Java二进制代码。
官网:
下载:
http://www.groovy-lang.org/download.html
w3cschool的Groovy教程:
https://www.w3cschool.cn/groovy/groovy_environment.html
安装:
使用:
groovysh
命令进入groovysh。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
注:
Groovy允许使用一个实际类型,如String、Date、Employee定义变量等,也可以使用def关键字。使用def关键字的是动态数据类型,可改变,而使用String等直接声明的是静态数据类型的。
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]
注:
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语法。
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'])
}
注: