10 главных конструкций языка Kotlin

Что­бы быст­ро начать про­грам­ми­ро­вать на язы­ке, доста­точ­но знать несколь­ко основ­ных кон­струк­ций и общих пра­вил напи­са­ния кода. Со вре­ме­нем вы осво­и­те все нюан­сы, а на стар­те мож­но исполь­зо­вать что-то попроще.

Если вы не зна­е­те, зачем нужен Kotlin и что на нём про­грам­ми­ру­ют, почи­тай­те нашу ста­тью про Kotlin. А если зна­е­те — вот вам крат­кий спра­воч­ник по осно­вам языка.

Ком­мен­та­рии
Пере­мен­ные
Ввод и вывод
При­сва­и­ва­ние и сравнение
Услов­ный опе­ра­тор if
Опе­ра­тор мно­же­ствен­но­го выбо­ра when
Цик­лы
Функ­ции
Клас­сы
Объ­ек­ты

👉 В Kotlin будет мно­го кон­струк­ций, похо­жих на Java. Это нор­маль­но, пото­му что Kotlin рабо­та­ет тоже поверх вир­ту­аль­ной маши­ны JVM, как и Java.

Точ­ка с запя­той в Кот­лине не нужна.

Комментарии

Всё как обыч­но — есть одно­строч­ные и мно­го­строч­ные комментарии:

// Это однострочный комментарий

// Для каждой строки нужно добавлять его отдельно

/* А это — многострочный

его можно сделать любой длины,

если в начале и в конце поставить нужные символы */

Переменные и типы данных

Мно­гие про­грам­ми­сты руга­ют Kotlin за то, что клю­че­вые сло­ва для пере­мен­ной и кон­стан­ты отли­ча­ют­ся все­го на одну букву:

val — объ­яв­ля­ет константу

var — объ­яв­ля­ет переменную

Из-за это­го лег­ко оши­бить­ся и сде­лать кон­стан­ту вме­сто пере­мен­ной и наоборот.

val a: Int = 1 // можно сразу указать тип константы
val b = 1   // а можно не указывать, тогда тип назначится автоматически

val c: Int  // когда константа сразу не получает значение, нужно обязательно указать её тип
c = 1       // этот тип будет использоваться при объявлении константы

var x = 5 // здесь тип тоже назначается автоматически
var y: Int  // указываем вручную, что у нас переменная целочисленного типа

Ввод и вывод

Что­бы вве­сти что-то с кла­ви­а­ту­ры, нам нуж­на пере­мен­ная, где будет хра­нить­ся резуль­тат вво­да и коман­да readLine(). Эта коман­да ждёт, когда поль­зо­ва­тель вве­дёт любые дан­ные и нажмёт Enter. После это­го всё, что ввёл поль­зо­ва­тель, отправ­ля­ет­ся в ту переменную.

Для выво­да исполь­зу­ют­ся коман­ды print() и println() — пер­вая остав­ля­ет кур­сор на той же стро­ке, а вто­рая после выво­да пере­во­дит кур­сор на новую строку.

Что­бы выве­сти зна­че­ние пере­мен­ной в коман­де выво­да, перед пере­мен­ной ста­вят знак доллара:

var s // переменная, куда мы отправим результат ввода
print("Напишите что-нибудь: ") // выводим фразу и оставляем курсор на той же строке
s = readLine() // читаем данные с клавиатуры
println("Вот что вы только что ввели: $s") // выводим нашу фразу и значение переменной

Присваивание и сравнение

Всё так же, как в Java, но без точек с запятой:

// это присваивание

x = 10

// а это — сравнение x и 10

// результат сравнения отправляется в переменную b

var bol: Boolean

b = (x == 10)

Условный оператор if

Рабо­та­ет как обыч­но: сна­ча­ла про­ве­ря­ет­ся усло­вие, и если оно истин­но — выпол­ня­ет­ся код, кото­рый идёт после усло­вия. Если резуль­тат про­вер­ки лож­ный — выпол­ня­ет­ся код, напи­сан­ный после else, или не выпол­ня­ет­ся ниче­го, если тако­го бло­ка в усло­вии нет. Усло­вие пишет­ся в скоб­ках, фигур­ные скоб­ки мож­но не писать, если нуж­но выпол­нить толь­ко одну команду.

if (a > b) // проверяем условие
    s = a + 10 // одна команда, поэтому можно без фигурных скобок
  else { // если условие ложно, то делаем то, что написано в этом блоке
  	s = a - 10 // раз больше одной команды, то ставим фигурные скобки
  	b = b - 5
  }

Оператор множественного выбора when

Ана­лог клас­си­че­ско­го Case или Switch из дру­гих язы­ков про­грам­ми­ро­ва­ния. Коман­да смот­рит на зна­че­ние пере­мен­ной, кото­рое к ней посту­пи­ло, и срав­ни­ва­ет это зна­че­ние со сво­им спис­ком вари­ан­тов. Если есть сов­па­де­ние — выпол­ня­ет­ся нуж­ная команда.

var answer = readline() // получаем ответ от пользователя
when(answer){ // проверяем ответ по списку
    "Да" -> println("Правильный ответ")
    "Нет" -> {
    	 println("Неправильный ответ")
    	 count -= 1
    	}
    "Не знаю" -> count -= 2
    else -> println("Ответ не распознан, повторите снова")

}

Циклы

Про­ще все­го рабо­тать с цик­лом for: доста­точ­но ука­зать имя пере­мен­ной цик­ла и диа­па­зон, в кото­ром она будет меняться:

for (i in 1..6) {

    print("$i ")

}

При жела­нии мож­но ука­зать шаг цик­ла внут­ри диа­па­зо­на (по умол­ча­нию он равен единице):

for (i in 1..6 step 2) {

    print("$i ") // на экране появятся числа 1, 3 и 5

}

Цик­лы с пред­усло­ви­ем и с посту­сло­ви­ем выгля­дят и рабо­та­ют как в обыч­ном Java:

sum = 1
do { // начало цикла
    sum = sum + (sum + 1) // тело цикла
} while (sum < 1) // проверка условия

// и то же самое с циклом while
sum = 1
while (sum < 1) { // проверка условия
    sum = sum + (sum + 1) // тело цикла
}

Функции

У функ­ций в Kotlin пол­ная свобода:

👉 А ещё в Kotlin, как и в Java, каж­дая про­грам­ма состо­ит из функ­ций и каж­дая коман­да долж­на быть внут­ри какой-то функ­ции. Основ­ная функ­ция про­грам­мы назы­ва­ет­ся main.

Самое про­стое объ­яв­ле­ние и исполь­зо­ва­ние функ­ций в Kotlin выгля­дит так:

fun printHello() { //объявляем новую функцию
    println("Привет, это журнал Код!") // выводим приветствие
}
 
fun main() { // основная функция в каждой программе 
    printHello() // Вызываем нашу новую функцию
}

Классы

Клас­сы в Кот­лине под­дер­жи­ва­ют пол­но­цен­ные кон­струк­то­ры и ини­ци­а­ли­за­ции, но для стар­та доста­точ­но объ­явить имя клас­са и его содержимое:

class Client(val name: String, var bonus: Int, val sity: String) { //объявляем класс с тремя свойствами
    fun printBonus() { // добавляем функцию внутрь класса
    	println("У клиента $bonus бонусных баллов")
    }
}

Объекты

Как и в боль­шин­стве ООП-языков, для созда­ния ново­го объ­ек­та доста­точ­но ука­зать класс, от кото­ро­го про­изой­дёт объ­ект. После это­го с объ­ек­том мож­но рабо­тать по всем пра­ви­лам объ­ект­но ори­ен­ти­ро­ван­но­го программирования:

class Client(val name: String, var bonus: Int, val sity: String) { //объявляем класс с тремя свойствами
fun printBonus() { // добавляем функцию внутрь класса
    	println("У клиента $bonus бонусных баллов")
    }
}

var ivanov = Client("Сергей Иванов", 500, "Санкт-Петербург") // создаём новый объект с покупателем
println(ivanov.name) // выводим его имя
println(ivanov.sity) // и его город
ivanov.bonus() // используем встроенную в класс функцию, чтобы узнать количество бонусных баллов

Текст:

Миха­ил Полянин

Редак­тор:

Мак­сим Ильяхов

Худож­ник:

Даня Бер­ков­ский

Кор­рек­тор:

Ири­на Михеева

Вёрст­ка:

Ники­та Кучеров

Соц­се­ти:

Олег Веш­кур­цев