1.分号不是必须的
2.单引号和双引号都可以定义一个字符串常量
3.单引号没有运算能力,双引号有运算能力。双引号中调用变量的规则是一个美元符号紧跟着一对花括号,花括号里放表达式,比如{1+1}等,只有一个变量的时候可以省略花括号,如{it.key},Value:${it.value}"
}
输出:
map的类型:java.util.LinkedHashMap
1024
440
Key:width,Value:1024
Key:height,Value:440
6.方法的调用:
1.在Groovy中方法是可以省略()的,非常简洁;
2.return是可以不写的,在Groovy中,我们定义有返回值的方法时,return语句不是必须的。当没有return的时候,Groovy会把 方法执行过程中的最后一句代码作为其返回值。
3.代码块是可以作为参数传递的,代码块是一段被花括号包围的代码,Groovy是允许其作为参数传递的,从下面代码可以看 出:
//呆板的方法其实是这样
num.each({println it})
//我们格式化一下,会好看一点
num.each({
println it
)}
//Groovy规定,如果方法的最后一个参数是闭包,可以放到方法外面
num.each(){
println it
}
//然后方法的括号可以省略,就变成了我们经常看到的格式
num.each{
printl it
}
4.JavaBean:在Java中为了访问和修改JavaBean的属性,我们不得不重复生成getter/setter方法,并且使用它们,太繁琐,Groovy中得到了很大的改善:
class Person{
private String name
}
Person p=new Person()
println "名字是:"+p.name
p.name="eddy"
println "名字是:"+p.name
在没有给name赋值的时候,输出的是null,赋值后,输出的就是eddy了。
在Groovy中,并不是一定要定义成员变量才能作为类的属性访问,我们直接用getter/setter方法,也一样可以当做属性访问:
class Person{
private String name
public int getAge(){14}
}
Person p=new Person()
p.name="eddy"
println "名字是:{p.age}"
输出: 名字是:eddy,年龄:14
通过上面的例子可以发现,我并没有定义一个age变量,但是一样可以通过p.age获取到该值,这是因为定义了getAge()方法。但是这个时候不能修改age的值,因为我们没有顶一个setter方法。
7.闭包是Groovy的一个非常重要的特征,可以说它是DSL的基础。闭包不是Groovy的首创,但是它支持这一重要特征,这就使得代码灵活、轻量、可复用,再也不用像Java一样动不动就要用一个类了。虽然Java有了匿名内部类,但还是一样冗余不灵活。
前面我们说过,闭包其实就是一个段代码块,下面我们就一步步实现自己的闭包,了解闭包的it变量的由来。集合的each方法我们已经非常熟悉了,实现一个类似的闭包功能:
task closure<<{
//使用我们自定义的闭包
customEach{println it}
}
def customEach(closure){
//模拟一个有10元素的集合,开始迭代
for(int i in 1..10){
closure(i)
}
}
上面例子我们定义了一个方法customEach,它只有一个参数,用于接收一个闭包。那么这个闭包如何执行呢?很简单,跟一堆括号就是执行了。
当闭包有一个参数时,默认就是it;当有多个参数时,it就不能表示了,我们需要把参数一一列出:
task closure<<{
//多个参数
customEach{k,v->
println "{v}"
}
}
def customEach(closure){
def map=['name':"jack","age":19]
map.each{
closure(it.key,it.value)
}
}
从例子中我们可以看到,我们为闭包传递了两个参数,一个key,另一个value,例子中k、v、->用于把闭包的参数和主题分开。
8.DSL(Domain Specific Language)的中文意思是领域特定语言,说白了就是专门关注某一领域的语言。Gradle就是一门DSL,它是基于Groovy的,专门解决自动化构建的DSL。
网友评论