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. 一条命令解决: sql server 2008 安装提示重启计算机

    0.将安装的iso文件解压 1. 使用管理员账户打开 cmd命令行 2.将命令行的路径切换到解压路径下,你应该可以看到setup.exe 3.执行命令  一条命令解决:setup.exe /SkipR ...

  2. jquery html() callback

    通过JQuery的.html()函数我们可以非常方便地加载一段HTML到指定的元素中,例如给<div></div>中放入一组图片.问题是JQuery的.html()函数是同步的 ...

  3. 初窥css---选择器及相关特性

    选择器及相关特性 基础选择器 标签选择器 相当于全选,在我看来局限性较大,也没啥意义的感觉,用处不太大 id选择器 有利于对于某个小盒子的部分属性进行改变,但是若是需要改的小盒子很多的话,就会很麻烦 ...

  4. LVM 磁盘分区扩容

    前提:将磁盘中未分区磁盘进行分区操作 https://www.cnblogs.com/guoxiangyue/p/10033367.html 然后进行vg扩容 pvcreate /dev/sdc lv ...

  5. 04 前端篇(JQuery)

    jquery: http://www.cnblogs.com/yuanchenqi/articles/5663118.html 优点:简洁.兼容 jquery 对象:   jQuery 或  $ 基本 ...

  6. springIOC原理加载过程

    关于spring ,我以前学过很多次,也看过很多的书.以及博客,但是总是不得要领,这次我再学习一遍,在这里做点记录,如果不对的地方还请大家指正 Ioc: inverse of controller 控 ...

  7. checkeds 选中获取tbale表格中某一列td标签中的值

    例如:  var checkedbox = $("input[type=checkbox][name='cid']:checked")   if (checkedbox.size( ...

  8. 算法笔记-exgcd

    扩展欧几里得 扩展欧几里德算法是用来在已知a, b求解一组x,y, 使它们满足贝祖等式: ax+by = gcd(a, b) =d(解一定存在,根据数论中的相关定理). 扩展欧几里德常用在求解模线性方 ...

  9. XAMPP支持多PHP版本

    在使用xampp进行开发的时候,我们都知道它只能支持一个PHP版本不能像PHPstudy那样方便进行不同版本的切换操作.因此我们手动的对于xampp进行改造一下,使其支持其他PHP版本 1. 从官网上 ...

  10. 【CF715E】Complete the Permutations 第一类斯特林数

    题目大意 有两个排列 \(p,q\),其中有一些位置是空的. 你要补全这两个排列. 定义 \(s(p,q)\) 为 每次交换 \(p\) 中的两个数,让 \(p=q\) 的最小操作次数. 求 \(s( ...