内容简介:进过上一篇入门篇 之后,我们正式开始学 Groovy。我们这些使用 Java 语言的,学习 Groovy 基本没有难度,不过需要注意一些特性,比如支持「闭包」、支持「DSL」。是一门非常灵活的动态脚本语言。Groovy 没有分号,别不习惯。
进过上一篇入门篇 之后,我们正式开始学 Groovy。
我们这些使用 Java 语言的,学习 Groovy 基本没有难度,不过需要注意一些特性,比如支持「闭包」、支持「DSL」。是一门非常灵活的动态脚本语言。
Groovy 没有分号,别不习惯。
一、集合
List、Set、Map、Queue 挺熟悉吧。一般我们常用 List 和 Map 。
def numList = [1,2,3,4,5] println numList.getClass().name 复制代码
这是不是赤裸裸的 Java 家的东西啊,哈哈~~
1、List
def numList = [1,2,3,4,5] println numList.getClass().name println numList[0] println numList[-1] println numList[0..3] numList.each{ println it } 复制代码
可以循环打印,连续打印挺方便的。it 变量是正在迭代的元素,涉及闭包的知识。
2、Map
def map1 = ['width':1024,'height':720,'name':'小明'] println map1.getClass().name println map1['width'] println map1.height println map1['name'] map1.each{ println "Key:${it.key},Value:${it.value}" } 复制代码
二、方法
1、省略
括号可以省略
method1(1,2) method1 1,2 def method1(int a,int b){ println a + b } 复制代码
return 可以不写 Groovy 会把方法执行过程中的最后一句代码作为返回值。
println method1 (1,2) def method1(int a,int b){ a + b } 复制代码
2、代码块可以作为参数传递
本来集合的 each 方法,参数其实就是一个闭包
numList.each({println it}) 复制代码
Groovy 规定如果方法的最后一个参数是闭包,可以放到方法的外面
numList.each(){ println it } 复制代码
然后 方法可以省略
numList.each{ println it } 复制代码
原来我们平时看到样式,还有这么一个演化史。
三、JavaBean
我们不必像 Java 那样写 getter setter 方法了。更懒得是,你写个 getAge 方法,会给你定义一个 age 变量。
class Person{ private String name; public getAge(){ 11 } } Person p = new Person() println "名字是:"+p.name p.name = '小明' println "名字是:"+p.name println "age:"+p.age 复制代码
四、闭包
说句实话,我以前也是一直不懂闭包是什么。我们通过运用理解一下。
1、传递参数
首先我们之前用过 集合的 each 方法,那么我们自己也来实现这个功能。
这 closure 参数用来接收 闭包代码块
def customEach(closure){ for(int i in 1..10){ closure i } } //进化调用 customEach({println it}) customEach(){println it} customEach{println it} 复制代码
当闭包只有一个参数的时候,默认他自己就是 it ,但是多个参数呢?
def customEachMap(closure){ def map1 = ['width':1024,'height':720,'name':'小明'] map1.each{ closure(it.key,it.value) } } customEachMap{ k,v -> println "${k} is ${v}" } 复制代码
我们可以看到这里就不能使用 it 了,而是显示的声明出来,比如 k,v-> 用于闭包的参数和主体区分开来。
2、闭包委托
Groovy 闭包还支持闭包方法的委托。 Groovy 闭包有 thisObject、owner、delegate 三个属性。默认情况下 delegate 和 owner 是相等的,但是 delegate 是可以被修改的。Gradle 中闭包的很多功能都是通过修改 delegeta 来实现的。
我们从结果来看, thisObject 就是这个构建脚本的上下文。 delegale 和 owner 是一样的,优先级是 thisObject > owner > delegate 。 当我们在 DSL,比如 Gradle 中的时候,一般会指定delegate 为当前的it,所以我们在闭包内可以对这个 it 进行配置。
class Student{ String name; int age; def dumpStudent(){ println "name is ${name} ,age is ${age}" } } def student (Closure<Student> closure){ Student p = new Student() closure.delegate = p; //委托模式优先 closure.setResolveStrategy(Closure.DELEGATE_FIRST); closure(p) } 复制代码
Student studnet1 = new Student() studnet1.age = 10 studnet1.dumpStudent() student{ name = '大明' age = 20 dumpStudent() } 复制代码
其实就是 delegate 代理了对象,通过闭包,来操作对象。
划重点: 本文是完全参考 《Android Gradle 权威指南》而写,作为学习笔记使用。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Learn Python the Hard Way
Zed A. Shaw / Addison-Wesley Professional / 2013-10-11 / USD 39.99
Master Python and become a programmer-even if you never thought you could! This breakthrough book and CD can help practically anyone get started in programming. It's called "The Hard Way," but it's re......一起来看看 《Learn Python the Hard Way》 这本书的介绍吧!