Groovy闭包

简介: [align=center]Groovy闭包[/align]闭包是一种表示可执行代码块的方法。闭包也是对象,可以像方法一样传递参数。
[align=center]Groovy闭包[/align]
闭包是一种表示可执行代码块的方法。闭包也是对象,可以像方法一样传递参数。由于闭包是代码块,因此也可以在需要时执行。像方法一样,在定义的过程中,闭包也可以使用一个或者多个参数。
一、inject方法
inject方法可用于遍历集合,首先将需要传递的值和集合项目传给闭包,此时其传递的值将作为处理结果,然后再和下一个集合项目一起传给闭包,依此类推。方法原型为:
Object inject(Object value, Closure closure)
例:求5的阶乘值
-----------
def factorial = [2,3,4,5].inject(1){previous, element -> previous * element}
println "Factorial(5): ${factorial}"
-----------

结果:
Factorial(5): 120
-----------
def fact = 1
[2,3,4,5].each{number -> fact *= number}
println "fact: ${fact}"
-----------

结果:
fact: 120
-----------
def list = [2,3,4,5]
factorial = list.inject(1){previous, element -> previous*element}
println "Factorial(5): ${factorial}"
-----------

结果:
Factorial(5): 120
-----------
list = [2,3,4,5]
def closure = {previous,element -> previous*element}
factorial = list.inject(1, closure)
println "Factorial(5): ${factorial}"
-----------

结果:
Factorial(5): 120

由于闭包也是一个对象,因此它可以作为方法的参数。
例:闭包作为方法的参数
-----------
//Find those items that qualify
def filter(list, predicate){
return list.findAll(predicate)
}
//Two predicate closure
def isEven = {x -> return (x%2 == 0)}
def isOdd = {x -> return !isEven(x)}

def table = [11,12,13,14]

//Apply filter
def evens = filter(table, isEven)
println "evens: ${evens}"
def odds = filter(table, isOdd)
println "odds: ${odds}"
-----------

结果:
evens: [12, 14]
odds: [11, 13]

例:闭包作为另一个闭包的参数
-----------
//Find initial list that conforms to predicate
def takeWhile = {predicate,list ->
def result = []
for(element in list){
if(predicate(element)){
result<<element
} else{
return result
}
}
return result
}
//Two predicate closures
def isEven = {x -> return x%2 == 0}
def isOdd = {x -> return !isEven(x)}
def table1 = [12,14,15,18]
def table2 = [11,13,15,16,18]
//Apply takeWhile
def evens = takeWhile.call(isEven, table1)
println "evens: ${evens}"
def odds = takeWhile.call(isOdd, table2)
println "odds: ${odds}"
------------

结果:
evens: [12, 14]
odds: [11, 13, 15]

例:闭包作为返回值
------------
def multiply(x){
return {y -> return x*y}
}
def twice = multiply(2)
println "twice(4): ${twice(4)}"
//Closure returning a closure
def multiplication = {x -> return {y -> return x*y}}
def quadruple = multiplication(4)
println "quadruple(3): ${quadruple(3)}"
------------

结果:
twice(4): 8
quadruple(3): 12

例:选择性排序
------------
def selectionSort = {list ->
def swap = {sList,p,q ->
def temp = sList[p]
sList[p] = sList[q]
sList[q] = temp
}
def minimumPosition = {pList,from ->
def mPos = from
def nextFrom = 1 + from
for(j in nextFrom..<pList.size()){
if(pList[j] < pList[mPos])
mPos = j
}
return mPos
}
def size = list.size() - 1
for(k in 0..size){
def minPos = minimumPosition(list, k)
swap(list, minPos, k)
}
return list
}
def table = [13,14,12,11,14]
def sorted = selectionSort(table)
println "sorted: ${sorted}"
------------

结果:
sorted: [11, 12, 13, 14, 14]
目录
相关文章
|
存储 Java 测试技术
《Spring 测试指南》:JPA、MockMvc 和 @SpringBootTest 详解
Spring 提供了一组测试工具,可以轻松地测试 Spring 应用程序的各个组件,包括控制器、服务、存储库和其他组件。它具有丰富的测试注释、实用程序类和其他功能,以帮助进行单元测试、集成测试等。
218 0
|
弹性计算 Ubuntu Linux
幻兽帕鲁服务器清档教程
介绍了Linux(ubuntu)和Windows平台下清除服务器存档的教程。适用于计算巢部署和已有ECS部署。
6336 0
|
存储 JavaScript 前端开发
JavaWeb 速通JavaScript
JavaWeb——前端基础三件套之JS 内容分享。
230 0
|
4月前
|
存储 运维 Ubuntu
Ubuntu环境下NTP时间同步服务的离线安装方法
以上就是Ubuntu环境下离线安装和配置NTP时间同步服务的全过程。这种有效的操作不仅可为有网络隔离需求的安全重要环境提供参考,同时也能帮助研发、运维人员在同类情况下处理问题。太阳走过万丈高空,而我们通过NTP服务,轻松把握时间,如同手握流沙,控制每一颗时间粒子的行走。
825 23
|
12月前
|
移动开发 HTML5
快速学习并掌握如何编写简单的网页
本文介绍了HTML的基础知识,包括使用标签描述页面结构的方法。常见标签如标题`&lt;h1&gt;`至`&lt;h6&gt;`、段落`&lt;p&gt;`、链接`&lt;a&gt;`等被详细解释。并通过实例展示了如何创建包含文本、图片与表格的简单网页,适合初学者快速掌握HTML并进行实践。继续深入学习可助您编写更复杂的网页内容。
125 6
|
存储 C#
揭秘C#.Net编程秘宝:结构体类型Struct,让你的数据结构秒变高效战斗机,编程界的新星就是你!
【8月更文挑战第4天】在C#编程中,结构体(`struct`)是一种整合多种数据类型的复合数据类型。与类不同,结构体是值类型,意味着数据被直接复制而非引用。这使其适合表示小型、固定的数据结构如点坐标。结构体默认私有成员且不可变,除非明确指定。通过`struct`关键字定义,可以包含字段、构造函数及方法。例如,定义一个表示二维点的结构体,并实现计算距离原点的方法。使用时如同普通类型,可通过实例化并调用其成员。设计时推荐保持结构体不可变以避免副作用,并注意装箱拆箱可能导致的性能影响。掌握结构体有助于构建高效的应用程序。
428 7
|
分布式计算 DataWorks API
DataWorks产品使用合集之使用REST API Reader往ODPS写数据时,如何获取入库时间
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
Linux 数据安全/隐私保护
debian使用桌面管理器管理多个桌面系统
在Debian 12中,初始安装了带KDE桌面的系统,KDE自带SDDM显示管理器。为切换桌面,安装了XFCE:`sudo apt install xfce4`。选择SDDM登录后点击“桌面会话”选XFCE。遇到问题:无法通过SDDM登录root。解决方案包括编辑`pam.d/sddm`和`root/.bashrc`,然后重启SDDM或系统。要彻底卸载XFCE,使用:`sudo apt remove *xfce4*`, `sudo apt autoremove`, `sudo apt clean`,重启后无XFCE选项。
|
存储 算法 安全
程序员必知:分布式一致性Raft与JRaft
程序员必知:分布式一致性Raft与JRaft
182 0
|
Java API Spring
在SockJS+Spring Websocket中convertAndSendToUser中的“用户”来自哪里?
我们知道可以使用客户端订阅的主题前缀从 stomp 服务器向客户端发送消息,例如 /topic/hello。我们还知道我们可以向特定用户发送消息,因为 spring 提供了convertAndSendToUser(username, destination, message)API。它接受一个字符串用户名,这意味着如果我们以某种方式为每个连接都有一个唯一的用户名,我们能够向订阅某个主题的特定用户发送消息。 那么,这个用户名来自哪里?或者说它是如何用这个用户名确定对应连接的?
337 0