如何使用groovy集合的collect()方法调用多个参数的闭包?

Rom*_*man 3 collections groovy closures

假设我有一个闭包:

def increment = {value, step ->
   value + step 
}
Run Code Online (Sandbox Code Playgroud)

现在我想循环遍历整数集合的每个项目,用5增加它,并将新元素保存到新集合:

def numbers = [1..10]
def biggerNumbers = numbers.collect {
      it + 5
} 
Run Code Online (Sandbox Code Playgroud)

现在我想通过使用increment闭包来实现相同的结果.我怎样才能做到这一点?

应该是这样的(下面的代码错误):

def biggerNumbers = numbers.collect increment(it, 5) //what's the correct name of 'it'??
Run Code Online (Sandbox Code Playgroud)

Nik*_*kov 10

你的问题的解决方案是在闭包中嵌套你的增量调用:

def biggerNumbers = numbers.collect {increment(it, 5)}
Run Code Online (Sandbox Code Playgroud)

如果你想将预制闭包传递给collect你应该使它兼容collect- 接受一个参数:

def incrementByFive = {it + 5}
def biggerNumbers = numbers.collect incrementByFive
Run Code Online (Sandbox Code Playgroud)


tim*_*tes 9

mojojojo有正确的答案,但只是以为我想补充的是,这看起来像一个很好的候选人柯里(特别是使用rcurry)

如果你有:

def increment = {value, step ->
   value + step 
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下方法调整此函数的右侧参数:

def incrementByFive = increment.rcurry 5
Run Code Online (Sandbox Code Playgroud)

然后,你可以这样做:

def numbers = 1..10
def biggerNumbers = numbers.collect incrementByFive
Run Code Online (Sandbox Code Playgroud)

只是觉得它可能有趣;-)