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. SpringMVC的相关知识

    前几天学习了SpringMVC 感觉比Servlet好用得多具体如下: 首先SpringMVC的概念: SpringMVC是一个前端控制框架,主要用来负责与页面的交互.SpringMVC是Spring ...

  2. c++字节对齐编译器指令#pragma

    第一种 #pragma pack(push, 1) // 先把当前对齐设置压栈,再设置为1字节对齐 struct S { char a; ]; }; #pragma pack(pop) // 恢复先前 ...

  3. 【spring源码分析】IOC容器初始化(七)

    前言:在[spring源码分析]IOC容器初始化(六)中分析了从单例缓存中加载bean对象,由于篇幅原因其核心函数 FactoryBeanRegistrySupport#getObjectFromFa ...

  4. python学习——读取染色体长度(五:从命令行输入染色体长度)

    # 传递命令行参数 # 导入sys模块 import sys print(sys.argv)   命令行操作 python argv.py 10 20 30 40 50 回车输出 ['argv.py' ...

  5. [题解]玩具谜题(toy)

    玩具谜题(toy) 来源:noip2016 提高组 day1 [题目描述] 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个 ...

  6. pycharm 安装dilb模块

  7. C# call webservice方法

    https://www.cnblogs.com/Fooo/p/5507153.html

  8. leanote使用本地账户时,去掉待同步的小红点

    切换开发者工具,如下图,点击左上角的箭头图标,选取元素,直接选择小红点. 然后会看到小红点来自于resources/app/public/themes/default.css文件中2092行: .it ...

  9. docker-lnmp dockerfile

    code: FROM php:7.1.26-fpm WORKDIR /usr/share/nginx/html # bcmath pdo_mysql intl gd zip opcache xdebu ...

  10. git学习03 - 撤销修改&删除文件

    撤销修改:git checkout -- filename :将工作区文件回到最近一次add 或者 commit的状态 撤销修改分为三种情况: 1.未提交至暂存区 使用git checkout -- ...