5.闭包闭包在我们groovy中起着很大比重,如果想要学好groovy,闭包一定得掌握好,
在我们build.gradle其实就有很多闭包使用:
如:
android{ sourcesets { main{ jnilibs.srcdirs = ['libs'] } }}这里面的
android {}
其实就是一个闭包结构,其内部的sourcesets{}又是闭包中的闭包,可以看到闭包在我们的gradle中无处不在.
学好闭包真的很关键
常用闭包方式:
{'abc'}{ -> 'abc'}{ -> abc+$it}{ string name -> 'abc'}{ name -> abc${name}}{ name,age -> abc${name}+age}5.1:闭包的定义及基本方法闭包概念:其实就是一段代码段,你把闭包想象为java中的回调callback即可,
闭包在groovy中是groovy.lang.closure 的实例,可以直接赋值给其他变量.
闭包的调用:
def closer = {1234}closer()closer.call()闭包参数:带参数的闭包 使用 -> 如果是一个参数可以直接使用it代替和kotlin中的lambda类型类似def closerparam = { name,age -> println hello groovy:${name}:${age} 'return hei'}def result = closerparam(lily,123)闭包返回值:闭包返回值 如果没有定义return则直接返回最后一句话的返回值println result //打印结果:return hei5.2:闭包使用详解5.2.1:与基本类型结合使用://upto:实现阶乘int x= fab_upto(5)println(x)int fab_upto(int number){ int result = 1 1.upto(number,{result*=it}) return result}//downto:实现阶乘int x1= fab_downto(5)println(x1)int fab_downto(int number){ int result = 1 number.downto(1){result*=it} return result}//times:实现累加int x2 = cal(101)println(x2)int cal(int number){def result = 0;number.times { result+=it}return result}5.2.2:与string结合使用string str = the 2 and 3 is 5//each:遍历查找,返回值是str自己println str.each {temp -> print temp.multiply(2)}//find查找一个符合条件的println str.find { it.isnumber()}//findall查找所有符合条件的,返回的是一个集合println str.findall { it.isnumber()}//any表示查找只要存在一个符合的就是trueprintln str.any { s -> s.isnumber()}//every表示全部元素都要符合的就是trueprintln str.every { it.isnumber()}//将所有字符进行转化后,放到一个list中返回def list = str.collect { it.touppercase()}println(list)5.2.3:与数据结构结合使用:
这部分操作和与string结合使用类似,不再讲解
5.2.4:与文件结合使用
这部分在讲解到文件操作的时候,再进行具体讲解
5.3:闭包进阶详解5.3.1:闭包关键变量:this,owner,delegate情况1 :一般情况:
def scriptcloser = { println scriptcloser:this:${this} println scriptcloser:owner:${owner} println scriptcloser:delegate:${delegate}}调用:scriptcloser()结果:scriptcloser:this:variable.closer@58a63629scriptcloser:owner:variable.closer@58a63629scriptcloser:delegate:variable.closer@58a63629可以看到一般情况下:三种都是相等的:都代表当前闭包对象
情况2 :我们来看下面的情况:闭包中有闭包
def nestclosure = { def innerclosure = { println innerclosure:this:+this.getclass() println innerclosure:owner:${owner.getclass()} println innerclosure:delegate:${delegate.getclass()} } innerclosure()}nestclosure()结果:innerclosure:this:class variable.closerinnerclosure:owner:class variable.closer$_run_closure10innerclosure:delegate:class variable.closer$_run_closure10看到在闭包中调用闭包:
this还是执行外部的closer对象,而owner和delegate变为了closer的内部闭包对象
情况3 :最后来看一种情况:使用delegate委托
class student{ def name def pretty = {println my name is ${name}} void showname(){ pretty.call() }}class teacher{ def name}student stu1 = new student(name: 'yuhb')teacher tea1 = new teacher(name: 'lily')//改变委托delegatestu1.pretty.delegate = tea1stu1.showname()//设置委托策略stu1.pretty.resolvestrategy = closure.delegate_firststu1.showname()结果:my name is yuhbmy name is lily通过上面三种情况:
总结出:
this:指向最外部的closer对象owner:执行当前闭包的closer对象,特指当前,所以对闭包中的闭包,指向内部的闭包delegate:这个是闭包的代理对象,如果有单独配置这个delegate,且设置了委托策略 =delegate_first, 则闭包中的所有内部属性都会优先使用delegate中的对象下面我们就来讲解闭包的委托策略
5.3.2:闭包委托策略闭包中给我提供了以下策略:
//优先使用ower中的属性public static final int owner_first = 0;//优先使用delegate中的属性public static final int delegate_first = 1;//只是有owner中的属性public static final int owner_only = 2;//只是有delegate中的属性public static final int delegate_only = 3;//使用this中的属性public static final int to_self = 4;通过5.3.1中的例子,我们也可以看出groovy默认使用的是owner_first的委托策略
6.文件groovy文件操作完全兼容java的文件操作,但groovy集成了自己的高阶使用方式
读文件:withreaderdef file = new file('../../hello_groovy.iml')def buf1 = file.withreader {reader -> char[] buf = new char[100] reader.read(buf) buf}println buf1写文件:withwriter//写文件:withwriter:实现文件拷贝操作def result = copy('../../hello_groovy1.iml','../../hello_groovy.iml') println resultdef copy(string desfilepath,string srcfilepath){try { file desfile = new file(desfilepath) if(!desfile.exists()){ desfile.createnewfile() } file srcfile = new file(srcfilepath) if(!srcfile.exists()){ return false }else{ srcfile.withreader {reader -> def lines = reader.readlines() desfile.withwriter {writer -> lines.each {line -> writer.write(line+'\\r\\n') } } return true } }}catch(exception e){ return false}}读对象:withobjectinputstream readobjectgroovy不仅可以写文件,还可以写入和读取对象操作
//读对象def ob1 = readobject('../../person.bin')println ob1def readobject(string srcfilepath){ try { file desfile = new file(srcfilepath) if(!desfile.exists()){ return false } desfile.withobjectinputstream { def person = it.readobject() println person.name } return true }catch(exception e){ return false }}写对象:withobjectoutputstream writeobject//写对象:person person = new person(name: 'uihb',age: 32)saveobject(person,'../../person.bin')def saveobject(object obj,string desfilepath){ try { file desfile = new file(desfilepath) if(!desfile.exists()){ desfile.createnewfile() } if(obj != null){ desfile.withobjectoutputstream { it.writeobject(obj) } } }catch(exception e){ return false }}7.json7.1:object转json字符串转//1.object 转jsondef personlist = [ new person(name: 'lily',age: 12), new person(name: 'lucy',age: 14), new person(name: 'kare',age: 18)]def jsonperson = jsonoutput.tojson(personlist)println jsonoutput.prettyprint(jsonperson)7.2:json字符串转object//2.json转objectdef jsonslurper = new jsonslurper()def obj = jsonslurper.parsetext(jsonperson)println(obj[0].name)从网络获取json数据操作:
这里引入okhttp
def getnetwork(string url){ okhttpclient client = new okhttpclient(); request request = new request.builder() .url(url) .get() .build(); call call = client.newcall(request) call.enqueue(new callback() { @override void onfailure(request _request, ioexception e) { } @override void onresponse(response response) throws ioexception { def res = new string(response.body().bytes()) println res jsonslurper jsonslurper1 = new jsonslurper() version objetres = (version)jsonslurper1.parsetext(res) println objetres.ecode } }) sleep(10000)}class version{ int ecode string emsg currentversion data}class currentversion{ string currentversion}
苹果不参与智能音箱竞争 HomePod与Amazon Echo的根本区别
边发射半导体激光器的工作原理和应用现状
华为、哈工大联手:基于硅和金刚石的三维集成芯片专利公布
嘉盛测试电池车曾涉爆炸 李嘉诚早入股
真香定律再现!中小企业数字化逃不过华为云轻量应用服务器
Gradle入门知识之Gradle语法2
易图通新版导航电子地图发布,实现真正的三维实景
采用MCU设计TWS耳机充电盒方案
Ultimaker以Ultimaker S5提高省事且专业的3D打印标准
美国商务部严禁美国公司直接向中国出口28nm相关的设备
泛自动驾驶领域光电感知专家灵途科技助力AGV行业发展
我国开发出磁性微游动机器人 像蚁群一样协同工作
关于夜狼安防小区高空抛物坠物视频监控解决方案的分析和介绍
中国钒电池工业化进展
明年情人节小米最好的礼物 将发布小米6 骁龙835+6GB+2000万像素
大疆正广揽人才致力研发自动驾驶技术
MAX4951BE SATA I/II/III双向转接驱动器
US381-000002-100BA压力变送器检测电路信号
华为鸿蒙专题报告:开启全新智能物联时代
智慧城市底是怎么一回事