Groovy闭包深入学习 - [203] 一直都有新高度 - ITeye技术网站

2023-10-18 06:20

本文主要是介绍Groovy闭包深入学习 - [203] 一直都有新高度 - ITeye技术网站,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Groovy闭包深入学习 - [203] 一直都有新高度 - ITeye技术网站

Groovy闭包深入学习 - [203] 一直都有新高度 - ITeye技术网站

Groovy闭包深入学习

博客分类: Groovy
Groovy Grails Java C C++ 
闭包



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 & 3
one 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 Groovyword = 'Wow'two('Java') // 输出 Wow JavaOneClosure.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为闭包

 

分享到:

posted on 2012-08-22 15:29  lexus 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/lexus/archive/2012/08/22/2650922.html

这篇关于Groovy闭包深入学习 - [203] 一直都有新高度 - ITeye技术网站的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/230753

相关文章

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

深入理解go中interface机制

《深入理解go中interface机制》本文主要介绍了深入理解go中interface机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前言interface使用类型判断总结前言go的interface是一组method的集合,不

深入解析Java NIO在高并发场景下的性能优化实践指南

《深入解析JavaNIO在高并发场景下的性能优化实践指南》随着互联网业务不断演进,对高并发、低延时网络服务的需求日益增长,本文将深入解析JavaNIO在高并发场景下的性能优化方法,希望对大家有所帮助... 目录简介一、技术背景与应用场景二、核心原理深入分析2.1 Selector多路复用2.2 Buffer

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Python实现PDF按页分割的技术指南

《Python实现PDF按页分割的技术指南》PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时,下面我们就来看看如何使用Python创建一个灵活的PDF分割工具吧... 目录需求分析技术方案工具选择安装依赖完整代码实现使用说明基本用法示例命令输出示例技术亮点实际应用场景扩

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语