Функциональное программирование
Анонимные функции (лямбда-выражение)
fun main () { val sum = {a: Int, b: Int -> a + b} }
пример с указанием параметров
val sum: (Int, Int) -> Int = {a, b -> a +b} (Int, Int) - параметры котоыре принимает функция -> Int - указываем какой тип возвращает функция
Пример:
val square (Int) -> Int = { a: Int -> a*a } компилятор знает, что передаем один параметр val square: (Int) -> Int = { it*it }
ПРИМЕРЫ:
fun main () { val sum = { a: Int, b: Int, c: Int -> a + b + c } val text: (String) -> Unit = { println("Привет, $it")} val square: (Int) -> Int = { it*it } val array: (Array<Int>) -> Array<Int> = { for (i in it.size - 2 downTo 0) { for (j in 0..i) { if (it[j] < it[j+1]) { val temp = it[j] it[j] = it[j+1] it[j + 1] = temp } } } it } val sortedArray = array(arrayOf(3,4,51,2)) for (a in sortedArray) { println(array) } }
Функции высшего порядка
filter
fun main () { val listOfNumbers = mutableListOf<Int>() for (i in 0..99) { listOfNumbers.add(i) } val listOfEvenNumbers = listOfNumbers.filter { number: Int -> number%2 == 0 } }
Заполняем массив 100 элементами, сортируем только четные.
Filter - принимает в качестве параметра boolean и создает новую коллекцию - если условие истинно, оставляет элемент.
val listOfEvenNumbers = listOfNumbers.filter { it %2 == 0 } val listOfNames = mutableListOf<String>("Петя","Аня", "Андрей", "Дима", "Арнольд","Кирилл") val listOfEvanNames = listOfNames.filter { it.first() == 'А' } val nameStartsFromA = listOfNames.filter { it.startsWith('А') }
it.first() == 'А'
it.startsWith('А')
map
Мы можем создать новый список на основе существующего, но с необходимыми изменениями
Оператор map() преобразует данные потока. В качестве параметра он принимает функцию преобразования. Функция преобразования принимает в качестве единственного параметра объект из потока и возвращает преобразованные данные.
val numbers = (0..100).toList() val doubledNumbers = numbers.map { it*2 } val employees = numbers.map { "Employee №$it" } for (i in employees) { println(i) }
https://metanit.com/kotlin/tutorial/9.6.php
sorted (Сортировка)
val ara = arrayOf(5, -199, 24, 42, 41, 65, 1, 42, 999) val sortedAra = ara.sorted() val sortedAra2 = ara.sortedDescending() for (i in sortedAra) { println(i) }
Бесконечные последовательности
take
fun main () { val array = (0..1000).toList() val employees = array.map { "Employee №$it" } val first30 = employees.take(30) //выведет первые 30 val last30 = employees.takeLast(30) //выведет последние 30 val dropFirst30 = employees.drop(30) //выведет все кроме первых 30 val array2 = generateSequence(0) {it +2} val evenList = array2.take(10) for (first in evenList) { println(first) } }
generateSequence(0) {it +2} - генерирует бесконечный массив (на самом деле нет) по мере его наполнения.
Вывод бесконечного массива.
Вариант №1
val stringArray3 = generateSequence(0) { it+1 }.map { "Сотрудник №$it" } val evenList = stringArray3.take(100) for (first in evenList) { println(first) }
Вариант №2
val stringArray5 = generateSequence("Сотрудник №1") { val index = it.substring(11).toInt() "Сотрудник №${it+1}" }