假设我有一个闭包:
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'??
答案 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 }