Котлинские лямбды

Лямбда-выражения

Лямбда-выражение или просто лямбда - это анонимная функция; функция без имени. Эти функции передаются немедленно как выражение без объявления. Например,

 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

Рекомендуемая литература

  • Котлин закрытие
  • Котлин С и применить

Интересные статьи...