加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Groovy闭包

发布时间:2020-12-14 16:59:59 所属栏目:大数据 来源:网络整理
导读:Groovy闭包 闭包是一种表示可执行代码块的方法。闭包也是对象,可以像方法一样传递参数。由于闭包是代码块,因此也可以在需要时执行。像方法一样,在定义的过程中,闭包也可以使用一个或者多个参数。 一、inject方法 inject方法可用于遍历集合,首先将需要传

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 , 5 ]

factorial?
= ?list.inject( 1 ){previous,?element? -> ?previous * element}

println?
" Factorial(5):?${factorial} "

-----------
结果:
Factorial(5): 120
-----------

list? = ?[ 2 , 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 , 16 , 18 ]

// Apply?takeWhile

def ?evens? = ?takeWhile.call(isEven,?table1)

println?
" evens:?${evens} "

def ?odds? = ?takeWhile.call(isOdd,?table2)

println?
" odds:?${odds} "

------------
结果:
evens: [12,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 , 11 , 14 ]

def ?sorted? = ?selectionSort(table)

println?
" sorted:?${sorted} "

------------结果:sorted: [11,12,14,14]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读