Освой 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)
}
Отдельные части данных не могут изменятся после создания.
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