Как вызвать замыкание с несколькими параметрами из метода collect () коллекции groovy? - PullRequest
3 голосов
/ 09 октября 2011

Допустим, у меня есть замыкание:

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 ]

10 голосов
/ 09 октября 2011

Решением вашей проблемы будет размещение вашего приращения в закрытии:

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

Если вы хотите передать готовое закрытие в collect, вы должны сделать его совместимым с collect - принимая один параметр:

def incrementByFive = {it + 5}
def biggerNumbers = numbers.collect incrementByFive
9 голосов
/ 10 октября 2011

mojojojo имеет правильный ответ, но я подумал, что могу добавить, что это выглядит как хороший кандидат для карри (в частности с использованием rcurry)

Если у вас есть:

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

Затем вы можете указать правый параметр этой функции с помощью:

def incrementByFive = increment.rcurry 5

И тогда вы можете сделать:

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

Просто подумал, что это может быть интересно; -)

0 голосов
/ 06 августа 2015

Основная проблема заключается в том, что [1..10] создает List<IntRange>, который вы пытаетесь увеличить.Вы должны collect на IntRange напрямую (обратите внимание на отсутствие скобок):

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

Или с карри:

def sum = { a, b -> a + b }
(1..10).collect(sum.curry(5))
...