Лямбда-вирази
Лямбда-вираз або просто лямбда є анонімною функцією; функція без імені. Ці функції передаються негайно як вираз без оголошення. Наприклад,
fun main(args: Array) ( val greeting = ( println("Hello!")) // invoking function greeting() )
Коли ви запускаєте програму, результат буде:
Привіт!
Тут лямбда-вираз призначається змінному привітанню. Вираз не приймає жодних параметрів і не повертає жодного значення в цій програмі.
Потім функція (лямбда-вираз) викликається як:
привітання ()
Приклад: лямбда з параметрами та типом повернення
У наведеній нижче програмі є лямбда-вираз, який приймає два цілі числа як параметри і повертає добуток цих двох цілих чисел.
fun main(args: Array) ( val product = ( a: Int, b: Int -> a * b ) val result = product(9, 3) println(result) )
Коли ви запускаєте програму, результат буде:
27
Тут вираз лямбда:
Зверніть увагу, лямбда-вираз укладено всередині фігурних дужок.
Функція вищого порядку
Koltin має чудову підтримку функціонального програмування. Ви можете передавати функції як аргументи іншим функціям. Крім того, ви можете повернути функцію з інших функцій. Ці функції називаються функціями вищого порядку.
Часто лямбда-вирази для зручності передаються функції вищого порядку (а не типовій функції).
Приклад: передача лямбди функції
Передамо лямбда-вираз функції вищого порядку. Ось як ви можете це зробити.
fun callMe(greeting: () -> Unit) ( greeting() ) fun main(args: Array) ( callMe(( println("Hello!") )) )
Коли ви запускаєте програму, результат буде:
Привіт!
Тут callMe()
функція вищого порядку (оскільки вона приймає функцію як параметр). Параметр привітання приймає лямбду, передану callMe()
функції, як:
привітання: () -> Одиниця
Порожні дужки припускають, що передана анонімна функція не приймає жодних параметрів. І Unit
ключове слово припускає, що анонімна функція не повертає жодного значення.
Лямбди часто використовують під час роботи з колекціями. І в стандартній бібліотеці є кілька вбудованих функцій, які беруть лямбди, щоб полегшити наше завдання. Ви побачите кілька прикладів тут:
Приклад: функція maxBy ()
Функція maxBy () повертає перший елемент, що дає найбільше значення даної функції або null
якщо елементів немає.
data class Person(val name: String, val age: Int) fun main(args: Array) ( val people = listOf( Person("Jack", 34), Person("Shelly", 19), Person("Patrick", 13), Person("Jill", 12), Person("Shane", 22), Person("Joe", 18) ) val selectedPerson = people.maxBy(( person -> person.age )) println(selectedPerson) println("name: $(selectedPerson?.name)" ) println("age: $(selectedPerson?.age)" ) )
Коли ви запускаєте програму, результат буде:
Особа (ім'я = Джек, вік = 34) ім'я: Джек вік: 34
Тут maxBy()
функція бере список об'єктів Person і повертає об'єкт Person, що має максимальний вік.
it Ключове слово: використовується для одного параметра
У наведеній вище програмі лямбда-вираз приймає лише один параметр (список об’єктів Person). У таких випадках ви можете посилатися на аргумент, використовуючи ключове слово it
.
Ви можете замінити
val selectedPerson = people.maxBy ((person -> person.age))
з
val selectedPerson = people.maxBy ((it.age))
у вищезазначеній програмі.
Приклад: maxBy () та функція startWith ()
Програма нижче обчислює максимальний вік об’єкта Person, починаючи з літери S.
Ми використаємо дві функції бібліотеки maxBy()
і startsWith()
для виконання цього завдання. Функція starsWith () повертається, true
якщо вона починається із зазначеного символу, переданого як аргумент.
data class Person(val name: String, val age: Int) fun main(args: Array) ( val people = listOf( Person("Jack", 34), Person("Shelly", 19), Person("Patrick", 13), Person("Jill", 12), Person("Shane", 22), Person("Joe", 18) ) val selectedPerson = people .filter ( it.name.startsWith("S") ) .maxBy( it.age ) println(selectedPerson) println("name: $(selectedPerson?.name)" ) println("age: $(selectedPerson?.age)" ) )
Коли ви запускаєте програму, результат буде:
Особа (ім'я = Шейн, вік = 22) ім'я: Шейн вік: 22
Рекомендовані читання
- Котлін Закриття
- Котлін С і подати заявку