Найкращий спосіб зрозуміти мову — написати на ній код. Не читати про неї, не дивитися вебінари, не зберігати статті "прочитаю потім" (ми всі знаємо, чим це закінчується). Kotlin з нуля: туторіал для початківців - 1Відкрити IDE і написати щось робоче.

Цей туторіал саме для цього. Ми пройдемо від нуля до першого робочого міні-застосунку. Якщо знаєте Java — буде ще швидше, показуватиму паралелі.

Запустити Kotlin: два способи, один із них займає нуль хвилин

Прямо в браузері. Заходьте на play.kotlinlang.org — і пишіть. Нічого не встановлювати, не налаштовувати, не читати Stack Overflow про те, чому не встановлюється. Ідеально для першого знайомства.

В IntelliJ IDEA. Підтримка Kotlin вбудована. Створюєте новий Kotlin-проєкт — і все готово. Жодних плагінів, жодних танців із бубном.

Перша програма:

fun main() {
    println("Hello, Kotlin!")
}

У Java це виглядало б так:

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello, Kotlin!");
    }
}

Обидва варіанти роблять одне й те саме. Просто в Kotlin немає public static void і класу-обгортки, тому що... а навіщо вони були потрібні? Гарне запитання. Java так і не відповіла.

val і var: два слова, які треба запам'ятати

У Kotlin змінні оголошуються через val або var.

val name = "Alice"   // Незмінна. Аналог final у Java.
var age = 25         // Змінна.

age = 26             // Ок.
name = "Bob"         // Помилка компіляції.

Просте правило: використовуйте val скрізь, де значення не потрібно змінювати. var — тільки коли реально потрібно. Це як домовитися з собою заздалегідь: "я це не змінюватиму". І Kotlin простежить, щоб ви не передумали о третій ночі.

Тип можна не вказувати — Kotlin виведе сам:

val score = 100     // Kotlin розуміє: це Int
val name = "Alice"  // Це String

Або явно, якщо хочеться:

val score: Int = 100
val name: String = "Alice"

Null-safety: як Kotlin вбиває NullPointerException

Тоні Хоар придумав null у 1965 році і пізніше назвав це своєю "помилкою на мільярд доларів". Звучить як самокритика, але насправді — скромність. NullPointerException обійшовся індустрії набагато дорожче.

У Java будь-яка змінна може виявитися null. Компілятор мовчить. Дізнаєтеся про це в runtime. У production. Добре хоч не на демо у клієнта — хоча й таке буває.

Kotlin вирішив проблему на рівні системи типів:

var name: String = "Alice"
name = null  // Помилка компіляції. Одразу. До запуску.

Якщо змінна може бути null — потрібно сказати про це явно через ?:

var name: String? = "Alice"
name = null  // Домовилися, що nullable — тепер окей.

І що робити, коли потрібно викликати метод на такій змінній?

println(name?.length)        // Якщо null — поверне null. Не впаде.
println(name?.length ?: 0)   // Якщо null — поверне 0. Оператор Elvis.

Оператор називається Elvis — тому що ?: схоже на зачіску Елвіса Преслі. Це не жарт. Це офіційне пояснення в документації.

Функції

У Java:

public static int add(int a, int b) {
    return a + b;
}

У Kotlin:

fun add(a: Int, b: Int): Int {
    return a + b
}

Або ще коротше — для функцій з одного виразу:

fun add(a: Int, b: Int) = a + b

Kotlin вміє в параметри за замовчуванням. У Java для цього потрібно писати кілька перевантажених методів. У Kotlin — один:

fun greet(name: String, greeting: String = "Hello") {
    println("$greeting, $name!")
}

greet("Alice")        // Hello, Alice!
greet("Bob", "Hey")   // Hey, Bob!

Рядкові шаблони — $name у рядку. Kotlin підставляє значення змінної прямо туди. Жодних + і конкатенацій — як у нормальних мовах.

Data class: прощавай, boilerplate

Ось задача. Потрібна модель: користувач з ім'ям, віком і email.

У Java це конструктор, три геттери, три сеттери, equals(), hashCode(), toString(). Або Lombok. Або змиритися і писати руками, наче на дворі 2005 рік.

У Kotlin:

data class User(val name: String, val age: Int, val email: String)

Один рядок. Компілятор генерує все інше, включно з copy():

val alice = User("Alice", 30, "alice@example.com")
val olderAlice = alice.copy(age = 31)

println(alice)
// User(name=Alice, age=30, email=alice@example.com)

Подивіться на copy(). Ви створюєте новий об'єкт, змінюючи тільки потрібні поля. У Java для цього зазвичай пишуть Builder. Або просто страждають.

Extension functions: додаємо методи до чужих класів

Уявіть: хочете додати метод до класу String. У Java — утилітарний клас зі статичними методами, і потім скрізь пишете StringUtils.doSomething(myString). Працює, але виглядає як милиця.

У Kotlin — extension function:

fun String.isValidEmail(): Boolean {
    return this.contains("@") && this.contains(".")
}

println("user@example.com".isValidEmail())  // true
println("це-не-email".isValidEmail())       // false

Виглядає як рідний метод класу. Жодного наслідування, жодних обгорток. Просто додали метод — і користуєтеся.

Збираємо все разом: валідатор користувачів

Візьмемо все, що дізналися, і напишемо щось реальне.

data class User(val name: String, val email: String?)

fun String.isValidEmail() = contains("@") && contains(".")

fun validateUser(user: User): String {
    val emailStatus = user.email?.let {
        if (it.isValidEmail()) "валідний" else "невалідний"
    } ?: "не вказано"

    return "${user.name}: email $emailStatus"
}

fun main() {
    val users = listOf(
        User("Alice", "alice@example.com"),
        User("Bob", "bob-not-email"),
        User("Charlie", null)
    )
    users.forEach { println(validateUser(it)) }
}

Виведення:

Alice: email валідний
Bob: email невалідний
Charlie: email не вказано

Зверніть увагу: null оброблено без жодного if. Оператори ?. і ?: роблять це елегантно. Чарлі не вказав email — і жодного NPE. Життя прекрасне.

Це було тільки початком

Тут розібрали основи: змінні, null-safety, функції, data class, extension functions.

Далі цікавіше. Корутини — асинхронний код без болю. Sealed classes — потужна альтернатива switch, яка не дозволяє забути обробити випадок. Функціональна робота з колекціями — map, filter, reduce в один рядок.

Якщо хочеться вивчити Kotlin системно, а не шматками зі статей, які потім губляться у вкладках — спробуй наш курс. 62 рівні, 1100+ завдань з автоперевіркою, 3 проєкти в портфоліо. Перший рівень безкоштовно.

javarush.com/ua/courses/kotlin

Читайте далі по темі