Groovy闭包是一种可执行代码块的方法,闭包也是对象,可以向方法一样传递参数,因为闭包也是对象,因此可以在需要的时候执行,像方法一样闭包可以传递一个或多个参数。闭包最常见的用途就是处理集合,可以遍历某个集合,并将对元素的操作作用于遍历出来的集合元素上。

闭包的语法是{comma-separated-form-parameter-list ->statement-list},如果不需要形参则可以省略->间隔符

下面是最简单的闭包形式

1 def cols={
2 println "Hello Word!"
3 }
4cols.call()

带参闭包

1 def cols2={param->
2 println "${param}"
3 }
4cols2("哈哈")

单个隐参数

def cols3={
println "Hello ${it}"
}
cols3("二狗")

闭包在定义的时候就能访问外部的属性值

1 def greeting="Hello"
2 def cols4={param->
3 println "${greeting},${param}"
4 }
5 cols4("二狗")

闭包也常用在集合中,使用闭包可以更加的高效的遍历集合的元素,并将闭包应用到每个元素中去。

1 [1,2,3,4,5].each { println it}
2 ['张三':100,'李四':200,'王五':300].each { println it}
3 ['张三':100,'李四':200,'王五':300].each { println it.key+":"+it.value}

也可以根据条件对集合进行筛选

1  [1,2,3,4].each {num-> if(num%2==0) println num}
2 ['张三':100,'李四':200,'王五':300].each {if(it.value==200) {println it}}

find方法返回集合中符合某个判断标准的第一个值,在闭包中,集合元素使用的判断条件必须是bool表达式

1 def num = [1,2,3,4].find{p->p>2}
2 println num
3 def map=['张三':100,'李四':200,'王五':300].find {it.value>100}
4 println map

findAll方法是遍历所有的元素并返回一个符合条件的列表

1 num = [1,2,3,4].findAll {p->p>2}
2 println num
3 map = ['张三':100,'李四':200,'王五':300].findAll {it.value>100}
4 println map

collect用法:collect将遍历某个集合,并使用闭包中的变换方法将集合中的元素转换成一个新值,collect方法返回的是由转换后的值所组成的列表

1 def  staff= ["李铭":10,"李浩":20,"二狗":50]
2 list=staff.collect {e->++e.value}
3 println "staff:${list}"
4 staff = staff.collect {e->++e.value;return e}
5 println staff

inject用法:inject可用于遍历集合,首先将需要传递的值和集合中遍历出来的元素传给闭包,此时其传递的值将作为一个处理结果然后在和下一个集合元素一起传给闭包,依次类推

1 def factories = [2,3,4,5].inject(1){p,e->p*e}
2 println "factories1:${factorials}"
3 list = [2,3,4,5]
4 def clos6 = {p,e->p*e}
5 factories = list.inject (1,clos6)
6 println "factories2:${factories}"

闭包可以作为方法的参数使用

 1 def filter(list ,predicate){
2 return list.findAll(predicate)
3 }
4 def isEven={x-> return (x%2==0)}
5 def isOdd={x-> return !isEven(x)}
6 def table =[11,12,13,14]
7 def evens = filter(table,isEven)
8 def odds = filter(table,isOdd)
9 println "even:${evens}"
10 println "odds:${odds}"

闭包也可以作为另一个闭包的参数使用

 1 def takewhile = { predicate, list ->
2 def reslut = []
3 for (element in list) {
4 if (predicate(element)) {
5 reslut << element
6 }
7 }
8 return reslut
9 }
10 def isEven = { x -> return (x % 2 == 0)}
11 def isOdds = { x -> return !isEven(x) }
12 def table = [45, 65, 81, 15, 22, 16]
13 def evens = takewhile(isEven, table)
14 println evens
15 def odds = takewhile(isOdds, table)
16 println odds

闭包作为返回值

1 //定义一个函数,函数的返回值是个闭包
2 def twice(x)
3 { return {y-> return x*y}}
4 //定义一个闭包接收函数的返回值,闭包里面的返回值是两个参数的乘积
5 def multiply =twice(2)
6 //闭包所带的参数就是twice()函数里面的返回值里面的参数
7 println "multiply(4):${multiply(4)}"

使用Groovy闭包进行选择排序

 1 //选择排序
2 //定义一个闭包select
3 def select={list->
4 //定义swap闭包实现集合元素的交换
5 def swap={
6 x,y,slist->
7 def temp=slist[x]
8 slist[x]=slist[y]
9 slist[y]=temp
10
11 }
12 //定义minmos闭包选取集合中最小元素的坐标
13 def minmos={
14 //From作为起始坐标,将以From为坐标的元素与集合中的其他元素进行大小比较
15 mlist,From ->
16 def mopos=From
17 def next=From+1
18 for (j in next..<mlist.size()){
19 //如果有元素比起始坐标的元素小则将坐标进行调换,最终筛选出来的mopos坐标是元素最小的坐标
20 if (mlist[j]<mlist[mopos])
21 mopos=j
22
23 }
24 return mopos
25 }
26 //从第一个坐标下的元素开始与其他元素进行比较,依次循环
27 for (i in 0..list.size()-1){
28 def pos=minmos(list,i)
29 swap(i,pos,list)
30 }
31 return list
32 }
33 table=[10,5,7,6,8,4,5]
34
35 println select(table)

Groovy闭包详解的更多相关文章

  1. Python闭包详解

    Python闭包详解 1 快速预览 以下是一段简单的闭包代码示例: def foo(): m=3 n=5 def bar(): a=4 return m+n+a return bar >> ...

  2. Swift 中的Closures(闭包)详解

    Swift 中的Closures(闭包)详解 在Swift没有发布之前,所有人使用OC语言编写Cocoa上的程序,而其中经常被人们讨论的其中之一 -- Block 一直备受大家的喜爱.在Swift中, ...

  3. PHP中的闭包详解

    PHP闭包(Closure)使用详解 作者: 字体:[增加 减小] 类型:转载 时间:2013-05-02我要评论 本篇文章介绍了,PHP闭包(Closure)的使用介绍,需要的朋友参考下   不知不 ...

  4. js闭包详解

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 闭包的特性 闭包有三个特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数 ...

  5. JavaScript之作用域与闭包详解

    前言: JavaScript是一种应用非常广泛的语言,其也有一些自身特点和优势,本文重在讲述其作用域机制以及闭包,会从一些实例来探讨其机理. 作用域在JavaScript程序员日常使用中有不同的含义, ...

  6. JS重点特性——闭包详解

    闭包特性:可以让定义好的函数作用域在调用时发生改变,具体说,调用运行时,可以让(定义时)作用域外其他函数访问到本函数的局部变量甚至参数.举例代码如下: <!DOCTYPE html> &l ...

  7. JavaScript 闭包详解

    一.Javascript闭包的用途 事实上,通过使用闭包,我们可以做很多事情.比如模拟面向对象的代码风格:更优雅,更简洁的表达出代码:在某些方面提升代码的执行效率. 1.匿名自执行函数 我们知道所有的 ...

  8. js 闭包 详解

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 闭包的特性 闭包有三个特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数 ...

  9. javascript闭包详解

    以前写过一篇关于javascript闭包的随笔,javascript闭包,但是写的不够详细,也没有体现出闭包的强大之处.故作此篇. 众所周知,javascript没有块级作用域,只有函数作用域.那就意 ...

随机推荐

  1. SSH服务与tcp wrappers实验

    SSH服务与tcp wrappers实验 实验环境: 一台linux(ssh client) 一台linux(ssh server) 实验步骤: 1.配置IP,测试连通性 2.在客户端创建用户yuzl ...

  2. SQL LAST() 函数

    LAST() 函数 LAST() 函数返回指定的字段中最后一个记录的值. 提示:可使用 ORDER BY 语句对记录进行排序. SQL LAST() 语法 SELECT LAST(column_nam ...

  3. 在source中查看代码

    如果你想查看网页的代码,有时会出现这种情况: o my god!啥都看不出来!这要怎么办?放弃吗,当然不啦! 点击这个神奇的按钮,奇迹发生了! 瞬间变成这个样子,哇,好激动!

  4. Scala--控制结构和函数

    一.条件表达式 val s = if(x > 1) 1 else -1 s 可以是 val var s = 0 if(x > 1) s = 1 else s = -1 s 必须是 var ...

  5. EntityFramework 6.x和EntityFramework Core必须需要MultipleActiveResultSets?

    前言 本节我们来探讨到底需不需要在连接字符串上加上MultipleActiveResultSets = true ?,若您有更深层次的理解欢迎留下您的脚印. EntityFramework 6.x和E ...

  6. git客户端的安装及使用

    1.git提交全部文件的基本步骤: 1)git status:查看修改内容 2)git add XX :添加XX文件到暂存区,如果修改内容比较多,可以使用git add -A .来一次性添加所有文件( ...

  7. 12 Django Rest Swagger生成api文档

    01-简介 Swagger:是一个规范和完整的框架,用于生成.描述.调用和可视化RESTful风格的Web服务.总体目标是使客户端和文件系统源代码作为服务器以同样的速度来更新.当接口有变动时,对应的接 ...

  8. Fum uc M-R ko P's R

    Milr-Rabin Dodod Avlo se \(n-1\) e \(u\cdot 2^t\). hen goch'n Toizz lme \([1,n-1]\) e \(l\). cak fe ...

  9. bboss oreach循环嵌套遍历map

    foreach循环嵌套遍历mapforeach嵌套dsl脚本定义 <property name="dynamicInnerDsl"> <![CDATA[{ ## ...

  10. celery 和 haystack

    celery  是分布式异步框架 haystack  是全文检索  只能在Django中用. 一.什么是celery?     ---->它是Python写的,所以只支持Python使用.但是消 ...