Лямбда-выражения
Лямбда-выражение или просто лямбда - это анонимная функция; функция без имени. Эти функции передаются немедленно как выражение без объявления. Например,
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
Здесь лямбда-выражение:
Обратите внимание: лямбда-выражение заключено в фигурные скобки.
Функция высшего порядка
У Колтина есть отличная поддержка функционального программирования. Вы можете передавать функции в качестве аргументов другим функциям. Также вы можете вернуть функцию из других функций. Эти функции называются функциями высшего порядка.
Часто лямбда-выражения передаются в функцию высшего порядка (а не в обычную функцию) для удобства.
Пример: передача лямбда в функцию
Давайте передадим лямбда-выражение функции высшего порядка. Вот как это сделать.
fun callMe(greeting: () -> Unit) ( greeting() ) fun main(args: Array) ( callMe(( println("Hello!") )) )
Когда вы запустите программу, вывод будет:
Здравствуйте!
Здесь callMe()
функция высшего порядка (поскольку она принимает функцию в качестве параметра). Параметр приветствия принимает лямбда, переданную callMe()
функции как:
приветствие: () -> Unit
Пустая скобка означает, что переданная анонимная функция не принимает никаких параметров. И 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 с максимальным возрастом.
Это ключевое слово: используется для одного параметра
В приведенной выше программе лямбда-выражение принимает только один параметр (список объектов Person). В таких случаях вы можете указать аргумент, используя ключевое слово it
.
Вы можете заменить
val selectedPerson = people.maxBy ((человек -> 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
Рекомендуемая литература
- Котлин закрытие
- Котлин С и применить