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

相关文章

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Java使用WebView实现桌面程序的技术指南

《Java使用WebView实现桌面程序的技术指南》在现代软件开发中,许多应用需要在桌面程序中嵌入Web页面,例如,你可能需要在Java桌面应用中嵌入一部分Web前端,或者加载一个HTML5界面以增强... 目录1、简述2、WebView 特点3、搭建 WebView 示例3.1 添加 JavaFX 依赖3

MySQL数据库约束深入详解

《MySQL数据库约束深入详解》:本文主要介绍MySQL数据库约束,在MySQL数据库中,约束是用来限制进入表中的数据类型的一种技术,通过使用约束,可以确保数据的准确性、完整性和可靠性,需要的朋友... 目录一、数据库约束的概念二、约束类型三、NOT NULL 非空约束四、DEFAULT 默认值约束五、UN

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4