Основы 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, b) = a + b

Автоматический вывод типов должен опираться на какие-то базовые значения, которыми зачастую выступают аргументы функции

Функции одного выражения #

В качестве тела функции может выступать выражение. Тогда тип возвращаемого значения определяется автоматически

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