На информационном ресурсе применяются рекомендательные технологии (информационные технологии предоставления информации на основе сбора, систематизации и анализа сведений, относящихся к предпочтениям пользователей сети "Интернет", находящихся на территории Российской Федерации)

Практически Groovy : Функциональное программирование с помощью использованием замыканий и карринга. Часть 3

Итерации и композиция

Из предыдущих статей этой серии вы помните, что замыкания обычно используются с методами итераторов, применяемыми к коллекциям List и Map . Метод итератора collect, например, применяет замыкание к каждому элементу коллекции и возвращает новую коллекцию с новыми значениями. В листинге 4 показано применение метода collect к List и Map. Коллекция List, обозначенная как ages, направляется в метод collect() вместе с единственным замыканием { element -> return element + 1 } в качестве параметра. Обратите внимание, что если последним параметром метода является замыкание, Groovy позволяет вам исключить его из списка фактических параметров и разместить сразу после закрывающей скобки.

Если фактических аргументов нет, круглые скобки можно опустить. Это продемонстрировано на примере метода collect(), который вызывается с объектом Map, обозначенным как accounts.


Листинг 4. Замыкания и коллекции

def ages = [20, 30, 40]
def accounts = ['ABC123' : 200, 'DEF456' : 300, 'GHI789' : 400]
def ages1 = ages.collect({ element -> return element + 1 })
def accounts1 = accounts.collect
{ entry -> entry.value += 10; return entry }
println "ages1: ${ages1}"
// ages1: [21, 31, 41]
println "accounts1: ${accounts1}"
// accounts1: [ABC123=210, GHI789=410, DEF456=310]
def ages2 = ages.collect { element -> return dec(element) }
println "ages2: ${ages2}"
// ages2: [19, 29, 39]

 

В последнем примере собираются все элементы из List, обозначенного ages , и к ним применяется замыкание dec (из листинга 3).

Композиция замыканий

Вероятно, одной из наиболее важных черт замыканий является композиция, в которой вы можете определить замыкание, целью которого будет сочетание других замыканий. С помощью композиции можно объединить несколько простых замыканий в более сложное.

В листинге 5 показан изящное замыкание composition . Теперь сосредоточьтесь и прочитайте внимательно: Параметры f и g представляют замыкания с одним параметром. Пока все хорошо? Далее, к некоторому значению параметра x применяется замыкание g и к полученному результату применяется замыкание f. Вот так так! Применяя карринг к первым двум параметрам замыкания, вы фактически можете создать новое замыкание, которое будет сочетать их действия.

Листинг 5 соединяет замыкания triple и quadruple в замыкание twelveTimes. Если применить его к фактическому параметру 3, будет возвращено значение 36.


Листинг 5. Композиция замыканий – это супер!

def multiply = { x, y -> return x * y }    
// замыкание
def triple = multiply.curry(3)
// triple = { y -> return 3 * y }
def quadruple = multiply.curry(4)
// quadruple = { y -> return 4 * y }
def composition = { f, g, x -> return f(g(x)) }
def twelveTimes = composition.curry(triple, quadruple)
def threeDozen = twelveTimes(3)
println "threeDozen: ${threeDozen}"
// threeDozen: 36

 

Здорово, правда?

Рекомендуем
Популярное
наверх