什么是闭包(Groovy) - flyleave - ITeye技术网站

news/2024/5/10 22:24:38/文章来源:https://blog.csdn.net/weixin_33947521/article/details/86137553

什么是闭包(Groovy) - flyleave - ITeye技术网站

什么是闭包(Groovy)

博客分类:Grails & Groovy
GroovyJavaCC++C# 
Groovy的闭包就像一个代码段或者说方法指针。它是一段被定义并在稍后的时点上运行的代码。

Simple Example


Java代码  收藏代码
  1. def clos = { println "hello! }  
def clos = { println "hello! }





Java代码  收藏代码
  1. 示例: def clos = { println "hello!}  
  2.       println "Executing the closure:"  
  3.       clos()    
示例: def clos = { println "hello!}println "Executing the closure:"clos()  

     





注意在上面的例子中,"hello"在闭包被调用的时候才打印出来,而不是在定义的时候。

Closures may be "bound" to variables within the scope where they are defined:

闭包可以与在特定范围内定义的变量绑定起来(这句不知翻译的对错,请看原文)


Java代码  收藏代码
  1. def localMethod() {  
  2.   def localVariable = new java.util.Date()  
  3.   return { println localVariable }  
  4. }  
  5.   
  6. def clos = localMethod()  
  7.   
  8. println "Executing the closure:"  
  9. clos()     //打印出当localVariables被创建时的时间  
def localMethod() {def localVariable = new java.util.Date()return { println localVariable }
}def clos = localMethod()println "Executing the closure:"
clos()     //打印出当localVariables被创建时的时间


参数:

闭包的参数在->之前被列出,比如


Java代码  收藏代码
  1. def clos = { a, b -> print a+b }  
  2. clos( 57 )                       //prints "12"  
def clos = { a, b -> print a+b }
clos( 5, 7 )                       //prints "12"




-> 这个符号是可选的,当你定义的闭包的参数小于两个时就可将其省略



隐含的变量

在闭包中,有几个变量有着特别的含义



it(注意是小写):

如果你的闭包定义仅含有一个参数,可以将其省略,Groovy自动用it来代替

比如:


Java代码  收藏代码
  1. def clos = { print it }  
  2. clos( "hi there" )              //prints "hi there"  
def clos = { print it }
clos( "hi there" )              //prints "hi there"




this, owner, 和 delegate



this :  如同在Java中一样,this 代表闭包被定义的类



owner : 包含闭包的对象,有可能是定义闭包的类或者是另外一个闭包



delegate : 默认与owner相同,but changeable for example in a builder or ExpandoMetaClass




Java代码  收藏代码
  1. Example:  
  2.   
  3. class Class1 {  
  4.   def closure = {   
  5.     println this.class.name  
  6.     println delegate.class.name  
  7.     def nestedClos = {  
  8.       println owner.class.name  
  9.     }  
  10.     nestedClos()  
  11.   }  
  12. }  
  13.   
  14. def clos = new Class1().closure  
  15. clos.delegate = this  
  16. clos()  
  17. /*  prints: 
  18.  Class1 
  19.  Script1 
  20.  Class1$_closure1  */  
Example:class Class1 {def closure = {println this.class.nameprintln delegate.class.namedef nestedClos = {println owner.class.name}nestedClos()}
}def clos = new Class1().closure
clos.delegate = this
clos()
/*  prints:Class1Script1Class1$_closure1  */




作为方法参数的闭包



当一个方法的最后一个参数是闭包的时候,我们可以将闭包紧随其后定义,如


Java代码  收藏代码
  1. def list = ['a','b','c','d']  
  2. def newList = []  
  3.   
  4. list.collect( newList ) {  
  5.   it.toUpperCase()  
  6. }  
  7. println newList           //  ["A", "B", "C", "D"]  
def list = ['a','b','c','d']
def newList = []list.collect( newList ) {it.toUpperCase()
}
println newList           //  ["A", "B", "C", "D"]




上一个例子也可以用下面的方法实现,就是稍显冗长。




Java代码  收藏代码
  1. def list = ['a','b','c','d']  
  2. def newList = []  
  3.   
  4. def clos = { it.toUpperCase() }  
  5. list.collect( newList, clos )   
  6.   
  7. assert newList == ["A""B""C""D"]  
def list = ['a','b','c','d']
def newList = []def clos = { it.toUpperCase() }
list.collect( newList, clos ) assert newList == ["A", "B", "C", "D"]


更多:

Groovy 用很多可以接受闭包作为参数的方法扩展了java.lang.Object

上文提到的 collect 就是这样一个例子 

collect(Collection collection) {closure} 返回一个集合,并将该集合的每一项添加到给定的集合中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_819854.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大型网站技术架构(二)架构模式

2019独角兽企业重金招聘Python工程师标准>>> 每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复工作。 所谓网站架构模式即为了解决大型网站面临的高并发访问、海量数据、高可靠…

大型网站技术架构(一)大型网站架构演化

2019独角兽企业重金招聘Python工程师标准>>> 看完了有一本书,就应该有所收获,有所总结,最近把《大型网站技术架构》一书给看完了,给人的印象实在深刻,再加上之前也搞过书本上讲的反向代理和负载均衡以及ses…

大型网站系统架构分析[转]

千万级的注册用户,千万级的帖子,nTB级的附件,还有巨大的日访问量,大型网站采用什么系统架构保证性能和稳定性? 首先讨论一下大型网站需要注意和考虑的问题。 数据库海量数据处理:负载量不大的情况下select、…

SEO完全手册之title优化

在我的博客发布了《花钱最少的推广方式之SEO》文章后,受到了很多看官的关注,再次万分感谢大家!从今天开始,我会每天更新一篇SEO优化的东西,也希望大家喜欢。在这里,我就不阐明搜索引擎工作的原理了&#xf…

从graphis链接到我的网站?

今天早上登陆Google分析,发现昨天的网站点击来源里居然有这么一项……有没有人能解释一下这是为什么?

springboot线程池_SpringBoot入门建站全系列(二十二)异步任务执行的几种方式

SpringBoot入门建站全系列(二十二)异步任务执行的几种方式一、概述异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完…

网站推荐:The Python Challenge 第一个编程解谜站点

The Python Challenge是一个过关式的解谜站点,使用的是经典在线解谜站点Not Pr0n的模式:根据提示找出下一关的网页地址。和Not Pr0n不同的是,在每一关里你都需要编写程序来寻找答案。虽然这个解谜站点的名字叫做Python Challenge,…

网站推荐:blackflip 基于Flash的web 2.0解谜游戏站

blackflip是一个有趣的智力游戏。在每一个关卡里,你需要画一条不自交的路线,这条路线经过的所有格子都将会反色,游戏的目标就是要让反色后同一行的所有格子恰好都同色。游戏规则很简单,但有一些关卡特别费脑子。我很喜欢这个游戏的…

网站页面左右_诠网科技|杭州网站建设成本都用在了哪里呢?

杭州网站建设成本都用在了哪里呢?企业到底为什么要做一个自己的网站呢?企业建站不是为了赶一时的潮流,企业建站只有把网络推广技术同企业的管理系统、服务系统和商务系统紧密地集成,才能发挥企业网站优化的作用。不过企业网站建设…

网站推荐:archimy.com 在线函数图象绘制

archimy.com是刚建立的一个在线数学工具,给人的第一印象非常不错。这个网站可以在线绘制出2D和3D的函数图象,支持参数方程,支持三角函数、反三角函数、对数、绝对值、取整、较大、较小等多种函数。你可以设定函数图象的绘制范围和取样步长。绘…

html 5 浏览器兼容性测试网站

为什么80%的码农都做不了架构师?>>> 浏览器兼容性测试网站 http://caniuse.com/ 转载于:https://my.oschina.net/doz/blog/497347

SEO细分领域项目汇总

因为自己也在从事网络营销业务,所以会经常分析一些的营销手法,今天卢松松整理了一下在百度体系下SEO的一些业务。本文介绍了一些SEO项目,里面有一些细节,仔细思考一下,也许你会发现新项目。(重点看第三条)1&#xff0c…

服务器 网站 未备案,域名解析到未备案服务器

域名解析到未备案服务器 内容精选换一换公网域名解析是基于Internet网络的域名解析过程,可以把人们常用的域名(如www.example.com)转换成用于计算机连接的IP地址(如1.2.3.4)。公网域名解析支持通过直接在浏览器中输入域名,访问网站或Web应用程序。云解析…

大型网站数据库架构分析

涉及知识点: 1,主从复制,读写分离 对主库修改数据,查询使用从库。一主多从,来降低数据库读取压力。2,分库分表 查看详情根据实体业务来分库,分表。如,根据数据的活跃性&#xff0c…

python 判断 网站是否是动态_错过金三银四,但是你不能错过这份Python面试大全...

最近听说很多同学在刷面试题,所以这里给大家整理了一下,现在企业面试的一些重灾区,我从大量的题目中总结了很多的知识,同时也对一些题目进行拓展了,但是在看了网上的大部分面试题不是很满意,一个是有些部分…

html 分页 惰性加载,懒加载实现的分页网站footer自适应

最近在做手机端,发现下拉刷新和上拉加载的jq控件很少而且自我感觉不好用,比如iscroll之类……然后自己写了个懒加载的,也很简单,最基础的代码【不喜勿喷,但蛮实用的】wap手机端懒加载分页:用之前先引用下jq…

怎么看网站调用了哪些js_SEO技术-蜘蛛评判网站内容质量高低看哪些细节

“内容为王”这句话是SEO站长一直以来不离口的一句话,从中反映出网站内容是网站排名优化的重中之重。网站内容的质量高低也是影响着蜘蛛评判网站打分的重要因素,一个高质量内容的页面一定是比低质量内容页面收录好,这是毋庸置疑的。对于SEO来…

FOX新剧Fringe #038; 官方网站上的一个小谜题

知道4400被砍后,我郁闷了很久,这个暑假又没啥值得期待的了。随之而来的消息让我整个人立即又振奋起来:今年9月FOX将要推出一部科幻惊悚新剧Fringe。FOX的这个新剧显然是下了血本的,从它的预告片和宣传力度就看得出来。据某些看了第…

注册域名与SEO搜索优化

为什么80%的码农都做不了架构师?>>> 注册域名应该考虑哪些对SEO和网站运营影响 域名是互联网公司和个人网站的无形资产之一,网站的内容、流量都有域名有关系。 一个好的域名对SEO搜索引擎优化和网站运营都有一定的影响。 1、域名的后缀 …

Azure 网站上的 Java

编辑人员注释:本文章由Windows Azure 网站团队的项目经理Chris Compy 撰写。 Microsoft 已推出针对 Azure 网站上基于 Java 的网站的支持。此功能旨在通过Azure 网站的可管理性和轻松扩展选项满足许多常见Java 场景的需求。 门户 UX 中的内…