Освой Kotlin играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

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

Рассмотрим в общем виде функциональное программирование (весьма поверхностно).

В целом функции в функциональном программировании схожи с математическими функциями - f(x) = y.

При этом выполняются два основных условия.

  • Входящие данные не изменяются
  • Для получения результата используются только функции

В целом функции используются в парадигме - что делать. В императивном программировании используется подход - пошаговые инструкции (как делать) и используют изменяемые состояния.

Лямбды и анонимные функции являются частью функционального программирования.

Итак, функции выдают одни и те же данные при таких же входящих данных в любое время.

Функции ничего не меняют за пределами своей видимости.

Простейшие примеры функций сложения двух чисел.


fun add(a: Int, b: Int): Int {
    return a + b
}

val sum: (Int, Int) -> Int = { x, y -> x + y }

Более сложные функции (First-Class и Higher-Order) могут использовать функции в качестве параметров и возвращать функции как результат.


fun<T, R> Collection<T>.map(transform: (T) - R): List<R> {
    val result = ArrayList<R>(size)

    for(item in this)
        result.add(transform(item))

    return result
}

Неизменяемость

Однажды созданное не менятся.


val list = listOf(1, 2, 3, 4, 5) // созданный список больше не меняется

val newList = list + 6 // созданный ранее список не меняется

Рекурсия

Функции легко могут вызывать себя, позволяя создавать рекурсию.


fun factorial(n: Int): Int {
    return if (n = 0) 1 else n * factorial(n - 1)
}

Tuples

Отдельные части данных не могут изменятся после создания.


val pair = "a" to 1

pair.first = "b" // не работает
pair.second = 2  // не работает

Другой пример.


// Данные класса нельзя менять после создания
data class Cat(
    val id: Int,
    val name = String,
    val birthDate: Int
)

val murzik = Triple(10, "Murzik", 2015)

Функции можно комбинировать.


fun addTwo(x: Int) = x + 2
fun multiplyByThree(x: Int) = x * 3
fun composed(x: Int) = multiplyByThree(addTwo(x))

println(composed(2)) // выводится 12
Реклама