博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Groovy闭包深入学习 - [203] 一直都有新高度 - ITeye技术网站
阅读量:7077 次
发布时间:2019-06-28

本文共 2334 字,大约阅读时间需要 7 分钟。

博客分类:
 
闭包
1. 定义和执行闭包
Java代码  
  1. def one = { num1, num2 ->  
  2.     println "param is: $num1 & $num2"  
  3. }  
  4. one(23)       // 简便写法。输出 param is: 2 & 3  
  5. one 23        // 省略()的等效写法  
  6.   
  7. one.call(23// 使用call方法  
  8. one.call 23  // 省略()等效写法  
def one = { num1, num2 ->	println "param is: $num1 & $num2"}one(2, 3)       // 简便写法。输出 param is: 2 & 3one 2, 3        // 省略()的等效写法one.call(2, 3) // 使用call方法one.call 2, 3  // 省略()等效写法

注意:

  • a) 闭包自身的定义写法。在参数与具体代码执行端间的分隔符是->,老版本的是|
  • b) 使用call方法,或简便写法。
  • c) 由于groovy可省略(),而引发的众多等效写法。
  • d) 单参数,可省略书写参数,在闭包内使用it变量引用参数。

2. 闭包作为参数返回

Java代码  
  1. def makeClosure(name) {  
  2.     return {  
  3.         println "Hello ${name}"  
  4.     }  
  5. }  
  6.   
  7. println makeClosure(‘World’) // 请问输出结果?   
def makeClosure(name) {    return {        println "Hello ${name}"    }}println makeClosure(‘World’) // 请问输出结果?

3. 闭包作为参数传递

Java代码  
  1. def run(closure) {  
  2.     closure.call()  
  3. }  
  4.   
  5. one = { println 'Hello, World!' }  
  6.   
  7. run(one)  
def run(closure) {	closure.call()}one = { println 'Hello, World!' }run(one)

4. 闭包使用外部变量

Java代码  
  1. class OneClosure {  
  2.     def static execute(closure) {  
  3.         def word = 'Cool' // !!! 注意不使用def的输出结果,理解方式使用引用  
  4.         closure('Grails')  
  5.     }  
  6.       
  7.     public static void main(args) {  
  8.         def word = 'Hello'  
  9.           
  10.         def two = {param -> println "${word} ${param}"}  
  11.         two('Groovy'// 输出 Hello Groovy  
  12.           
  13.         word = 'Wow'  
  14.         two('Java'// 输出 Wow Java  
  15.           
  16.         OneClosure.execute(two) // 输出 Wow Grails,而不是Cool Grails  
  17.     }  
  18. }  
class OneClosure {	def static execute(closure) {		def word = 'Cool' // !!! 注意不使用def的输出结果,理解方式使用引用		closure('Grails')	}	public static void main(args) {		def word = 'Hello'		def two = {param -> println "${word} ${param}"}		two('Groovy') // 输出 Hello Groovy		word = 'Wow'		two('Java') // 输出 Wow Java		OneClosure.execute(two) // 输出 Wow Grails,而不是Cool Grails	}}

注意:

  • a) 闭包可使用(引用)闭包外部定义的变量
  • b) 变量的定义必须在闭包的上面,否则有groovy.lang.MissingPropertyException异常。
  • c) 注意在代码标记出,如果不使用def的输出差异。具体解释可使用引用来理解。在一个闭包被定义后,使用的是闭包定义所在的外部对象,对于使用的外部对象的引用一直都不会改变(无论是否被作为参数传递)。

5. 使用闭包实现单方法接口

Java代码  
  1. interface Test {  
  2.     def one()  
  3. }  
  4.   
  5. def test = {println 'one'} as Test  
  6.   
  7. test.one()  
interface Test {    def one()}def test = {println 'one'} as Testtest.one()

  • a) 使用关键字as

6. 使用闭包实现多方法接口

Java代码  
  1. interface Test {  
  2.     def one()  
  3.     def two()  
  4. }  
  5.   
  6. def test = [  
  7.     one: {println 'one'},  
  8.     two: {println 'two'}  
  9.     ] as Test  
  10.   
  11. test.one()  
  12. test.two()  
interface Test {    def one()    def two()}def test = [    one: {println 'one'},    two: {println 'two'}    ] as Testtest.one()test.two()

 

  • a) 使用关键字as
  • b) 使用Map, key为接口名,value为闭包

 

分享到:

转载地址:http://indml.baihongyu.com/

你可能感兴趣的文章
【转】Git与Repo入门----不错
查看>>
PhoneGap安装配置
查看>>
C# DataGridView中合并单元格
查看>>
WinXP 无线技巧“区域没有通过无线网络中的发现”一个可能的原因!
查看>>
chrome(转)
查看>>
Java知多少(90)菜单
查看>>
基本语法 protocols Category extension
查看>>
切割图像(一)概要
查看>>
shell重定向
查看>>
系列文章--Python Web编程
查看>>
Swift - 搜索条(UISearchBar)的用法
查看>>
iOS开发之ImageView复用实现图片无限轮播
查看>>
文件系统中的目录查找
查看>>
openwrt-智能路由器hack技术(1)---"DNS劫持"
查看>>
第十二章 数据备份与还原
查看>>
[redis] Redis 配置文件置参数详解
查看>>
Java 多线程程序设计
查看>>
BZOJ4347 : [POI2016]Nim z utrudnieniem
查看>>
jquery validate自定义checkbox验证规则和样式
查看>>
WPF自定义控件与样式(14)-轻量MVVM模式实践
查看>>