Основы Kotlin
  #
Васильев Андрей Михайлович, 2024
Версии презентации
  Минимальное приложение
  #
За исключением конфигурации системы сборки минимальное приложение состоит только лишь из функции:
fun main() {
    println("Я работаю!")
}
- Синтаксис языка Си-подобный, т.е. уже знакомый и привычный
- Для описания функций и методов используется ключевое слово fun
- Аргументы описываются в скобках после имени функции
- Для вызова функции используется знакомый синтаксис: название функции, за которым в круглых скобках указывается набор аргументов
- Функция
printlnвыводит переданное ей значение на старндартный вывод, затем выводит символ новой строки
  Неизменяемые переменные
  #
Неизменяемые (только для чтения) локальные переменные определяются
с помощью ключевого слова val
- Присвоить им значение можно только один раз
- В большинстве случаев тип переменной может вывести компилятор из выражения
val a: Int = 1   // Инициализация при объявлении
val b = 1        // Тип `Int` определен автоматически
val c: Int       // Указывать тип обязательно, если переменная не
                 // инициализирована сразу
c = 1            // Последующее присвоение
В таких переменных удобно фиксировать очередные значения вычисления:
val first = 10
val second = 32
val sum = first + second
val multiplication = first * second
Значение каждого этапа зафиксировано в своей переменной
  Изменяемые переменные
  #
Изменяемые переменные объявляются с помощью ключевого слова var
var x = 5 // Тип `Int` определен автоматически
x += 1
Вы можете объявлять глобальные переменные
val PI = 3.14
var x = 0
fun incrementX() { 
    x += 1 
}
Теперь любая часть вашего приложения может в произвольный момент изменить
значение переменной x
  Описание функций
  #
Функция принимает два аргумента Int и возвращает Int
fun sum(a: Int, b: Int): Int {
    return a + b
}
Функция, не возвращающая никакого значения (void в Java)
fun printSum(a: Int, b: Int): Unit {
    println("сумма $a и $b равна ${a + b}")
}
Тип возвращаемого значения Unit может быть опущен
fun printSum(a: Int, b: Int) {
    println("сумма $a и $b равна ${a + b}")
}
  Типы аргументов функции
  #
Типы аргументов функции должны быть явно описаны
fun printRight(a: Int, columnWidth: Int) {
    val stringValue = a.toString()
    val offsetLength = columnWidth - stringValue.length
    val offset = " ".repeat(offsetLength)
    print(offset)
    println(stringValue)
}
Компилятор не может автоматически понять тип переменной и при следующей записи
будет выведена сооветствующая ошибка
Автоматический вывод типов должен опираться на какие-то базовые значения,
которыми зачастую выступают аргументы функции
  Функции одного выражения
  #
В качестве тела функции может выступать выражение. Тогда тип возвращаемого
значения определяется автоматически
fun sum(a: Int, b: Int) = a + b
Выражение не обязательно должно быть записано одну строку, оно может быть
многострочным
У такой функции тоже может быть определён тип возвращаемого значения
fun multiply(a: Double, b: Double): Double = a * b
  Строковые шаблоны
  #
Допустимо использование переменных внутри строк в формате $name или ${name}:
fun main(args: Array<String>) {
  if (args.size == 0) return
  print("Первый аргумент: ${args[0]}")
}
var a = 1
// просто имя переменной в шаблоне:
val s1 = "a равно $a" 
a = 2
// произвольное выражение в шаблоне:
val s2 = "${s1.replace("равно", "было равно")}, но теперь равно $a"
  Условные выражения
  #
Kotlin поддерживает классический взгляд на условный оператор
fun maxOf(a: Int, b: Int): Int {
    if (a > b) {
        return a
    } else if (a == b) {
        return a
    } else {
        return b
    }
}
  Условные выражения
  #
Однако if является условным выражением, т.е. он может иметь результат, который
может быть записан в переменную
val fist = 1
val second = 2
val max = if(first > second) first else second
Значение каждой ветки условного оператора должно возвращать значения одинакового
типа
val info = if (10 > 15) true else 42
val more = info + 1 // Невозможно понять какой тип у переменной info