Функциональное программирование

Функциональное программирование


В главное меню

Анонимные функции (лямбда-выражение)

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}"
}


Report Page