Из предыдущих статей этой серии вы помните, что замыкания обычно используются с методами итераторов, применяемыми к коллекциям List
и Map
. Метод итератора collect
, например, применяет замыкание к каждому элементу коллекции и возвращает новую коллекцию с новыми значениями. В листинге 4 показано применение метода collect
к List
и Map
. Коллекция List
, обозначенная как ages
, направляется в метод collect()
вместе с единственным замыканием { element -> return element + 1 }
в качестве параметра. Обратите внимание, что если последним параметром метода является замыкание, Groovy позволяет вам исключить его из списка фактических параметров и разместить сразу после закрывающей скобки.
collect()
, который вызывается с объектом Map
, обозначенным как accounts
.
Листинг 4. Замыкания и коллекции
def ages = [20, 30, 40] |
В последнем примере собираются все элементы из 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 } |
Здорово, правда?