Groovy闭包

简介: Groovy闭包 闭包是一种表示可执行代码块的方法。闭包也是对象,可以像方法一样传递参数。由于闭包是代码块,因此也可以在需要时执行。像方法一样,在定义的过程中,闭包也可以使用一个或者多个参数。

Groovy闭包


闭包是一种表示可执行代码块的方法。闭包也是对象,可以像方法一样传递参数。由于闭包是代码块,因此也可以在需要时执行。像方法一样,在定义的过程中,闭包也可以使用一个或者多个参数。
一、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]

目录
相关文章
|
5月前
|
安全
qq强制加好友无需对方同意, 绕过qq验证强制加好友,一键强制聊天工具
这是一款基于QQ的自动化打招呼工具,通过模拟点击和输入实现批量私信功能。软件包含布局设计、事件函数(如点我初始化、点我私信)及循环操作
|
虚拟化 数据安全/隐私保护
|
10月前
|
存储 算法 测试技术
【C++数据结构——线性表】求集合的并、交和差运算(头歌实践教学平台习题)【合集】
本任务要求编写程序求两个集合的并集、交集和差集。主要内容包括: 1. **单链表表示集合**:使用单链表存储集合元素,确保元素唯一且无序。 2. **求并集**:遍历两个集合,将所有不同元素加入新链表。 3. **求交集**:遍历集合A,检查元素是否在集合B中存在,若存在则加入结果链表。 4. **求差集**:遍历集合A,检查元素是否不在集合B中,若满足条件则加入结果链表。 通过C++代码实现上述操作,并提供测试用例验证结果。测试输入为两个集合的元素,输出为有序集合A、B,以及它们的并集、交集和差集。 示例测试输入: ``` a c e f a b d e h i ``` 预期输出:
286 7
|
缓存 安全 Java
Hibernate 中的 Session 是什么?
【8月更文挑战第21天】
248 0
|
存储 关系型数据库 MySQL
MySQL 中单表数据的最大行数应该控制在多少?
MySQL 中单表数据的最大行数应该控制在多少?
3362 1
MySQL 中单表数据的最大行数应该控制在多少?
|
存储 KVM 虚拟化
VMware 安装华三CAS云平台过程
H3C CAS是一款基于KVM和OpenStack的虚拟化管理平台,包括CVK(虚拟化内核)、CVM(虚拟化管理)、CIC(云业务管理)和SSV(自助服务虚拟化)四个组件。实验目的是在VMware上搭建CAS云平台,通过创建虚拟机、选择Ubuntu 64位操作系统、配置处理器和内存、挂载ISO镜像等步骤进行安装。安装完成后,通过IP:8080/cas或https://ip:8443/cas以admin/admin登录验证。
1404 1
|
存储 Java
什么情况下会产生StackOverflowError(栈溢出)和OutOfMemoryError(堆溢出)怎么排查
什么情况下会产生StackOverflowError(栈溢出)和OutOfMemoryError(堆溢出)怎么排查
|
Kubernetes 容器 Perl
技巧 | 使用Filebeat收集K8S应用日志
Logstash收集Kubernetes的应用日志, 发现logstash十分消耗内存(大约500M), 而改用filebeat(大约消耗10多M内存)。 在进行日志收集的过程中,我们首先想到的是使用Logstash,因为它是ELK stack中的重要成员,但是在测试过程中发现,Logsta.
6812 0
|
传感器 机器学习/深度学习 算法
基于matlab实现多输入多输出 MIMO的毫米波雷达FMCW
基于matlab实现多输入多输出 MIMO的毫米波雷达FMCW
|
Oracle 固态存储 关系型数据库
orion的使用
Orion是oracle提供的测试io性能的工具。它可以用来模拟Oracle数据库IO,也可以用来仿真ASM的条带化的功能
333 0