Найкращий спосіб зрозуміти мову — написати на ній код. Не читати про неї, не дивитися вебінари, не зберігати статті "прочитаю потім" (ми всі знаємо, чим це закінчується).
Відкрити 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 + bKotlin вміє в параметри за замовчуванням. У 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
Читайте далі по темі
- Що таке Kotlin і чому розробники масово додають його до резюме — якщо хочете зрозуміти контекст: звідки взялась мова, чому Google на неї поставив і що за історія з Oracle.
- Java vs Kotlin: чесне порівняння — тепер, коли ви бачили обидва синтаксиси, можна подивитись на детальне порівняння: null-safety, data class, корутини, сумісність.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ