Upgrade to Pro — share decks privately, control downloads, hide ads and more …

The beauty of Kotlin functions

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on. →

The beauty of Kotlin functions

Type of Kotlin functions and why inline functions appeared in the Kotlin.

Avatar for Pavlo Kuchirka

Pavlo Kuchirka

September 24, 2019

Other Decks in Programming

Transcript

  1. The beauty of Kotlin functions Type of Kotlin functions and

    why inline functions appeared in the Kotlin.
  2. The beauty of Kotlin functions Type of Kotlin functions and

    why inline functions appeared in the Kotlin.
  3. Аргументи по замовчуванню fun reformat(str: String, normalizeCase: Boolean = true,

    upperCaseFirstLetter: Boolean = true, divideByCamelHumps: Boolean = false, wordSeparator: Char = ' ') { ... } 8
  4. Аргументи по замовчуванню reformat(str) reformat(str, true, true, false, '_') reformat(str,

    normalizeCase = true, upperCaseFirstLetter = true, divideByCamelHumps = false, wordSeparator = '_' ) 11
  5. Аргументи по замовчуванню reformat(str) reformat(str, true, true, false, '_') reformat(str,

    normalizeCase = true, upperCaseFirstLetter = true, divideByCamelHumps = false, wordSeparator = '_' ) reformat(str, wordSeparator = '_') 12
  6. Результуючий тип Unit fun printHello(name: String?): Unit { if (name

    != null) println("Hello ${name}") else println("Hi there!") // return // return Unit } 16
  7. Не фіксоване число аргументів fun <T> asList(vararg ts: T): List<T>

    { val result = ArrayList<T>() for (t in ts) result.add(t) return result } 20
  8. Локальні функції fun dfs(graph: Graph) { fun dfs(current: Vertex, visited:

    Set<Vertex>) { if (!visited.add(current)) return for (v in current.neighbors) dfs(v, visited) } dfs(graph.vertices[0], HashSet()) } 23
  9. Локальні функції fun dfs(graph: Graph) { val visited = HashSet<Vertex>()

    fun dfs(current: Vertex) { if (!visited.add(current)) return for (v in current.neighbors) dfs(v) } dfs(graph.vertices[0]) } 24
  10. Функції-розширення (Extension Functions) fun MutableList<Int>.swap(index1: Int, index2: Int) { val

    tmp = this[index1] this[index1] = this[index2] this[index2] = tmp } val l = mutableListOf(1, 2, 3) l.swap(0, 2) 33
  11. Функції-розширення (Extension Functions) fun MutableList<Int>.swap(index1: Int, index2: Int) { val

    tmp = this[index1] this[index1] = this[index2] this[index2] = tmp } fun <T> MutableList<T>.swap(index1: Int, index2: Int) { val tmp = this[index1] this[index1] = this[index2] this[index2] = tmp } 34
  12. Посилання на функції fun isOdd(x: Int) = x % 2

    != 0 val numbers = listOf(1, 2, 3) println(numbers.filter(::isOdd)) // виведе [1, 3] 37
  13. Посилання на функції fun isOdd(x: Int) = x % 2

    != 0 fun isOdd(s: String) = s == "brillig" || s == "slithy" || s == "tove" val numbers = listOf(1, 2, 3) println(numbers.filter(::isOdd)) // посилається на isOdd(x: Int) 38
  14. Посилання на функції val predicate = ::isOdd // посилається на

    isOdd val predicate: (String) -> Boolean = ::isOdd // посилається на isOdd(x: String) 40
  15. Приклад: композиція функцій fun <A, B, C> compose(f: (B) ->

    C, g: (A) ->B) : (A) -> C { return { x -> f(g(x)) } } 41
  16. Приклад: композиція функцій fun <A, B, C> compose(f: (B) ->

    C, g: (A) ->B) : (A) -> C { return { x -> f(g(x)) } } 42
  17. Приклад: композиція функцій fun <A, B, C> compose(f: (B) ->

    C, g: (A) ->B) : (A) -> C { return { x -> f(g(x)) } } 43 fun isOdd(x: Int) = x % 2 != 0 fun length(s: String) = s.length val oddLength = compose(::isOdd, ::length) val strings = listOf("a", "ab", "abc") println(strings.filter(oddLength)) // виведе "[a, abc]"
  18. Приклад: композиція функцій fun <A, B, C> compose(f: (B) ->

    C, g: (A) ->B) : (A) -> C { return { x -> f(g(x)) } } 44 fun isOdd(x: Int) = x % 2 != 0 fun length(s: String) = s.length val oddLength = compose(::isOdd, ::length) val strings = listOf("a", "ab", "abc") println(strings.filter(oddLength)) // виведе "[a, abc]"
  19. Прив'язані функції val numberRegex = "\\d+".toRegex() println(numberRegex.matches("29")) // виведе "true"

    val isNumber = numberRegex::matches println(isNumber("29")) // виведе "true" 46
  20. Прив'язані функції val numberRegex = "\\d+".toRegex() println(numberRegex.matches("29")) // виведе "true"

    val isNumber = numberRegex::matches println(isNumber("29")) // виведе "true" val strings = listOf("abc", "124", "a70") println(strings.filter(isNumber)) // виведе "[124]" 47
  21. Функції вищого порядку fun <T> lock(lock: Lock, body: () ->

    T): T{ lock.lock() try{ return body() } finally { lock.unlock() } } 48
  22. Функції вищого порядку fun <T> lock(lock: Lock, body: () ->

    T): T{ lock.lock() try{ return body() } finally { lock.unlock() } } 49
  23. Функції вищого порядку fun <T> lock(lock: Lock, body: () ->

    T): T{ lock.lock() try{ return body() } finally { lock.unlock() } } 50
  24. Функції вищого порядку fun <T> lock(lock: Lock, body: () ->

    T): T{ lock.lock() try{ return body() } finally { lock.unlock() } } 51
  25. Функції вищого порядку fun <T> lock(lock: Lock, body: () ->

    T): T{ lock.lock() try{ return body() } finally { lock.unlock() } } 52
  26. Функції вищого порядку fun <T> lock(lock: Lock, body: () ->

    T): T{ lock.lock() try{ return body() } finally { lock.unlock() } } 53
  27. Функції вищого порядку fun <T> lock(lock: Lock, body: () ->

    T): T{ lock.lock() try{ return body() } finally { lock.unlock() } } 54
  28. Лямбда-вирази • Лямбда-вираз завжди укладено в фігурні дужки {} •

    Параметри (якщо вони є) оголошені до знака -> (допустимо не вказувати параметри) • Тіло виразу випливає після знака -> val sum = { x: Int, y: Int -> x + y } 57
  29. Лямбда-вирази val sum = { x: Int, y: Int ->

    x + y } val sum: (Int, Int) -> Int = { x, y -> x + y } 58
  30. Лямбда-вирази max(strings, { a, b -> a.length < b.length })

    fun compare(a: String, b: String): Boolean = a.length < b.length 61
  31. Лямбда-вирази fun <T> max(collection: Collection<T>, less: (T, T) -> Boolean):

    T? { var max: T? = null for (it in collection) if (max == null || less(max, it)) max = it return max } 62
  32. Лямбда-вирази fun <T> max(collection: Collection<T>, less: (T, T) -> Boolean):

    T? { var max: T? = null for (it in collection) if (max == null || less(max, it)) max = it return max } 63
  33. Лямбда-вирази fun <T> max(collection: Collection<T>, less: (T, T) -> Boolean):

    T? { var max: T? = null for (it in collection) if (max == null || less(max, it)) max = it return max } 64
  34. Лямбда-вирази fun <T, R> List<T>.map(transform: (T) -> R): List<R> {

    val result = arrayListOf<R>() for (item in this) result.add(transform(item)) return result } 67
  35. Лямбда-вирази fun <T, R> List<T>.map(transform: (T) -> R): List<R> {

    val result = arrayListOf<R>() for (item in this) result.add(transform(item)) return result } 68
  36. Анонімні функції fun(x: Int, y: Int): Int = x +

    y fun(x: Int, y: Int): Int { return x + y } 72
  37. Замикання var sum = 0 ints.filter { it > 0

    }.forEach { sum += it } print(sum) 73
  38. Вбудовані (inline) функції Ключове словом inline, яке підказує компілятору, що

    замість виклику функції він повинен вбудовувати її тіло в те місце, де відбувається виклик. 74
  39. Вбудовані (inline) функції Правило просте: якщо ваш код безліч разів

    викликає функцію, приймаючу лямбда в якості аргументу, краще зробити її inline-функцією. 75
  40. Нелокальні return fun hasZeros(ints: List<Int>): Boolean { ints.forEach { if

    (it == 0) return true // returns from hasZeros } return false } 82
  41. Crossinline inline fun f(crossinline body: () -> Unit) { val

    f = object: Runnable { override fun run() = body() } // ... } 83