前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Groovy中的闭包

Groovy中的闭包

作者头像
FunTester
发布2020-05-04 14:21:48
1.6K0
发布2020-05-04 14:21:48
举报
文章被收录于专栏:FunTesterFunTester

书接上文:

今天分享一下Groovy的闭包。基本上,我们可以将闭包视为代码,语句块,它们可以访问周围范围的所有变量或方法,并且可以将这些代码块分配给变量,并将它们传递到其他地方。

代码语言:javascript
复制
            def c = { println "hello" }
            c()

很简单,闭包只是一个语句,用大括号包含。您可以将其分配给变量,然后像常规方法调用一样调用此闭包。闭包具有一个默认的隐式参数,称为it。还可以提供自定义的参数。同样,就像方法中的情况一样,闭包的最后一个表达式是闭包的返回值。但是,如果您觉得可读性更高,也可以使用return关键字。

代码语言:javascript
复制
            def square = { it * it }
            assert square(3) == 9
            def lengthThan = { String s, int i -> return s.size() > i }
            //def lengthThan = { String s, int i -> s.size() > i }
            assert lengthThan("FunTester", 4) == true
            assert lengthThan("Fun", 6) == false

既然我们已经发现了闭包是什么样子,以及如何分配它们并调用它们,我们将了解如何将闭包作为参数传递给另一个方法,因为这就是我们要做的Groovy在集合上添加的each()findAll()方法。

代码语言:javascript
复制
            def log(Closure c) {
                println "Calling closure"
                def start = System.currentTimeMillis()
                println "记录信息: " + c()
                def end = System.currentTimeMillis()
                println "记录结果成功。(耗时: ${end - start} ms)"
            }
            log({ return "Groovy is best language!" })
            // 可以去掉括号
            log { return "Groovy is best language!" }

现在,闭包方面,我们已经小试牛刀。接下来,我们通过对集合使用each()方法对列表的每个元素调用闭包。我们将打印列表的所有名称:

代码语言:javascript
复制
            names.each({ String name -> println name })
            names.each { String name -> println name }
            names.each { println it }

在使用each()对每个元素应用闭包之后,由于使用了findAll()方法,我们将根据过滤器闭包来过滤名称的原始列表,从而创建一个新列表。此方法将查找集合中与作为参数传递的闭包所表示的条件匹配的所有元素。将在每个元素上调用此闭包,并且findAll()方法将仅返回一个布尔值,该布尔值说明当前值是否匹配。最后,将返回一个包含匹配元素的新列表。该闭包将替换原始Java类的lengthThan()方法。

def shortNames = names.findAll { it.size() <= 3 }

Groovy提供了其他几种此类方法,例如:

  • find():找到匹配的第一个元素
  • every():如果所有元素均符合条件闭包,则返回true
  • any():如果至少一个元素匹配,则返回true

现在,该通过应用我们刚刚了解的有关列表和闭包的知识,完成将最初的Java类转换为更简洁的Groovy类的时候了:

代码语言:javascript
复制
            def names = ["Ted", "Fred", "Jed", "Ned"]
            println names
            def shortNames = names.findAll { it.size() <= 3 }
            println shortNames.size()
            shortNames.each { println it }

  • 郑重声明:“FunTester”首发,欢迎关注交流,禁止第三方转载。

技术类文章精选

无代码文章精选

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 技术类文章精选
  • 无代码文章精选
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档