Още една седмица четене на Kotlin в действие! Глава 3 навлиза в дълбочина относно функциите в Kotlin.

(Вижте резюмета на други глави, всички изброени тук: https://medium.com/@calren24/reading-through-kotlin-in-action-428111b051ce)

Kotlin използва стандартни класове за събиране на Java

// kotlin code, example of creating collections
val set = hashSetOf(1, 2, 3)
val list = arrayListOf(1, 2, 3)
// we can see here that Kotlin is just using the standard Java
// classes we are already familiar with
>>> println(set.javaClass)
class java.util.HashSet
>>> println(list.javaClass)
class java.util.ArrayList
  • това улеснява взаимодействието със съществуващ Java код, тъй като не е необходимо да конвертирате колекции с взаимодействие между Java и Kotlin

Наименувани аргументи

  • Една от големите миризми на код, които често срещате в Java, са функциите, които приемат твърде много параметри. В крайна сметка, когато извикате споменатата функция, завършвате с нещо като:
someFunction(collections, true, false, true, 3);
  • горният пример затруднява четенето на кода и разбирането какво се случва. В тези ситуации се препоръчват строители
  • В Kotlin можете да извиквате функции с именувани аргументи като такива:
someFunction(collections, isColors = true, isPrimaryColors = false, numberOfSubColors = 3)
  • Възможността да използвате наименувани аргументи е още по-добра, тъй като ви позволява да указвате аргументи в произволен ред и също така да пропускате аргументи. това намалява броя на претоварващите методи/конструктори
fun <T> joinToString(
        collection: Collection<T>,
        separator: String = ", ",
        prefix: String = "",
        postfix: String = ""
): String
// without creating extra overloading methods, we can do something
// like such and have the undefined args go to the default value:
joinToString(listOfStrings, prefix = "pre");

Kotlin позволява функциите да бъдат поставени на най-високото ниво на файл източник извън клас

  • това намалява необходимостта от създаване на всички класове „Util“ за статични помощни методи, които всъщност не принадлежат никъде

Kotlin има нещо, наречено функции за разширение, което ви позволява да дефинирате допълнителни функции в допълнение към съществуващите

  • горните твърдения вероятно са объркващи, но следният пример го прави малко по-ясен
// since Kotlin projects are built on top of Java libraries, we can 
// import the commonly used libraries
package strings
// we can further build on top of the strings library as such
fun String.lastChar(): Char = this.get(this.length - 1)
// what the line above is actually doing is creating a static method // that accepts the object as its first arg
// and then call the function we just created
>>> println("caren".lastChar())
n

Kotlin има някои допълнителни полезни функции при работа с колекции като vararg, infix, декларации за унищожаване

  • vararg : декларира функция за вземане на произволен брой аргументи
  • infix : предоставя чист синтаксис за извикване на подобни на оператор методи с един аргумент.
// this function declaration is prefixed with the infix keyword
infix fun Any.to(other: Any) = Pair(this, other)
// thanks to the infix function from above, we can now do the 
// following
val numbersMap = mapOf(1 to "one", 2 to "two", 53 to "three")
// this is what the same line of code would look like without the 
// infix function
val numbersMap = mapOf(1.to("one"), 2.to("two"), 3.to("three));
// although this is a trivial example, more complicated situations // would better prove the power of infix functions
  • унищожаване на декларации: разопакова единична съставна стойност в множество променливи
infix fun Any.to(other: Any) = Pair(this, other)
// Kotlin allows you to initialize 2 variables of a Pair object
val (number, name) = 1 to "one"

  • Kotlin има много допълнителни методи при работа с низове(subStringBeforeLast(), subStringAfterLast(), split() приема множество аргументи от низове и много други)

Глава 1: Какво и защо
Глава 2: Основи на Kotlin