Kotlin Fundamentals · Довідка

Лямбди та функції вищого порядку — шпаргалка

Продовження довідки «Функції» — функції як значення.

1. Функціональний тип

() -> Unit              // без параметрів, нічого не повертає
(Int) -> String          // один параметр Int, повертає String
(Int, Int) -> Int        // два параметри, повертає Int
((Int, Int) -> Int)?     // nullable функціональний тип

2. Лямбда-вираз

val sum: (Int, Int) -> Int = { x: Int, y: Int -> x + y }
val sum2 = { x: Int, y: Int -> x + y }   // тип виведено автоматично

sum(2, 3)  // 5
ЧастинаЗначення
до ->параметри лямбди
після ->тіло; останній вираз — результат (без return)

3. Функція вищого порядку

Функція, що приймає іншу функцію як параметр (або повертає функцію):

fun operate(a: Int, b: Int, op: (Int, Int) -> Int): Int {
    return op(a, b)
}

operate(3, 4, { x, y -> x + y })  // 7

4. Trailing lambda

Якщо лямбда — останній аргумент, її виносять за дужки виклику:

operate(3, 4) { x, y -> x + y }

// якщо лямбда — єдиний аргумент, дужки прибирають повністю
run { println("Привіт") }

5. Неявний параметр it

Для лямбди з одним параметром ім'я можна не писати:

repeatAction(3) { println(it) }
Працює лише для одного параметра. Для двох і більше — імена обов'язкові.

6. Посилання на функцію (::)

fun isEven(n: Int) = n % 2 == 0

check(4, ::isEven)                       // замість { n -> isEven(n) }
val ref: (Int) -> Boolean = ::isEven     // можна зберегти в змінну
Вид посиланняПрикладКоли
на функцію верхнього рівня::isEvenфункція оголошена поза класом
bound-посилання на метод об'єктаfoo::toStringрозглянемо разом з класами
на конструктор::ClassNameрозглянемо разом з класами

Глосарій

функціональний тип (function type)
тип, що описує сигнатуру функції: (A, B) -> C
лямбда-вираз (lambda expression)
функція без імені, записана як значення: { x -> x + 1 }
функція вищого порядку (higher-order function)
функція, що приймає функцію як параметр або повертає функцію
trailing lambda
синтаксис, що дозволяє винести лямбду-останній-аргумент за дужки виклику
it
неявне ім'я єдиного параметра лямбди, коли ім'я не вказано явно
посилання на функцію (function reference)
оператор ::, що перетворює наявну функцію на значення функціонального типу

Джерело: Kotlin Docs — Higher-order functions and lambdas

← Довідка «Функції в Kotlin»

← Усі уроки