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

时间:2011-10-09 14:58:37

标签: collections groovy closures

假设我有一个闭包:

def increment = {value, step ->
   value + step 
}

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

def numbers = [1..10]
def biggerNumbers = numbers.collect {
      it + 5
} 

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

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

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

3 个答案:

答案 0 :(得分:10)

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

def biggerNumbers = numbers.collect {increment(it, 5)}

如果您想将预制封闭传递给collect,则应该使其与collect兼容 - 接受以下单个参数:

def incrementByFive = {it + 5}
def biggerNumbers = numbers.collect incrementByFive

答案 1 :(得分:9)

mojojojo有正确的答案,但我想补充一点,这似乎是currying(特别是using rcurry)的好候选人

如果你有:

def increment = {value, step ->
   value + step 
}

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

def incrementByFive = increment.rcurry 5

然后,你可以这样做:

def numbers = 1..10
def biggerNumbers = numbers.collect incrementByFive

只是觉得它可能有意义; - )

答案 2 :(得分:0)

主要问题是[1..10]会创建一个{1}},您尝试增加它。您应该直接在{Intrange上List<IntRange>(注意缺少括号):

collect

或咖喱:

(1..10).collect { it + 5 }