Теория быстро забывается, а код, написанный своими руками, остаётся в памяти надолго. Kotlin программирование на примерах — это самый короткий путь от «читаю документацию» до «уверенно пишу рабочие приложения». В этой статье я собрал практические фрагменты, которые раскрывают главные фишки языка, и вы сразу сможете опробовать их в деле.
Kotlin создавался как язык, который должен быть лаконичнее Java, но при этом не терять в выразительности. С первых минут вы замечаете, что kotlin программирование на примерах существенно экономит строки, избавляет от шаблонного кода и подсвечивает потенциальные ошибки ещё до запуска. Давайте посмотрим, как это работает на реальных кусках кода — от базовых конструкций до более продвинутых техник.
Базовые конструкции, которые вы будете использовать каждый день
Начнём с переменных и типов. В Kotlin вы сразу указываете, может ли переменная хранить null, и компилятор за этим следит.
val name: String = "Алиса" // неизменяемая переменная
var age: Int = 25 // изменяемая
var nickname: String? = null // допускает null
Условные операторы и when делают код чистым:
val result = if (age >= 18) "Взрослый" else "Ребёнок"
val status = when {
nickname != null -> "Пользователь $nickname"
name.length > 10 -> "Длинное имя"
else -> "Гость"
}
Функции, которые радуют лаконичностью
Функции в Kotlin могут быть записаны в одну строку, принимать параметры по умолчанию и использовать именованные аргументы. Это сильно повышает читаемость.
fun greet(user: String = "мир", excited: Boolean = false): String {
val ending = if (excited) "!!!" else "."
return "Привет, $user$ending"
}
println(greet(excited = true)) // Привет, мир!!!
Расширяющие функции позволяют добавить новое поведение любому классу без наследования:
fun String.isEmail(): Boolean = this.contains("@") && this.contains(".")
println("test@example.com".isEmail()) // true
Data-классы: никакого бойлерплейта
Обычная модель данных в Java занимает десятки строк. В Kotlin достаточно одной:
data class Person(
val id: Int,
val name: String,
val age: Int
)
val p1 = Person(1, "Иван", 30)
val p2 = p1.copy(age = 31)
println(p1) // Person(id=1, name=Иван, age=30)
println(p1 == p2) // false (структурное сравнение всё равно работает)
Здесь вы получаете equals, hashCode, toString и copy бесплатно. Это одна из тех фишек, ради которой разработчики массово переходят на kotlin программирование на примерах.
Лямбды и коллекции: одна цепочка вместо циклов
Функциональный подход к работе с коллекциями превращает громоздкие циклы в выразительные цепочки вызовов.
val numbers = listOf(1, 2, 3, 4, 5, 6)
val doubledEvens = numbers
.filter { it % 2 == 0 }
.map { it * 2 }
println(doubledEvens) // [4, 8, 12]
Лямбда-параметр it добавляет ещё больше краткости. А функции области видимости (apply, run, let, also, with) помогают чётко ограничивать контекст и выполнять действия над объектами.
val sb = StringBuilder().apply {
append("Hello")
append(", ")
append("Kotlin")
}
println(sb.toString()) // Hello, Kotlin
Работа с асинхронностью на корутинах
В современном kotlin программирование на примерах корутины стали стандартом для многопоточности. Вот как можно запустить отложенную операцию, не блокируя основной поток:
import kotlinx.coroutines.*
suspend fun fetchData(): String {
delay(1000) // имитация сетевого запроса
return "Данные с сервера"
}
fun main() = runBlocking {
println("Загрузка...")
val data = fetchData()
println(data)
}
Корутины идеально вписываются в Android-разработку через lifecycleScope или viewModelScope, но показанный код можно запустить в любом Kotlin-проекте, даже консольном.
Делегаты: переиспользование поведения без наследования
Ключевое слово by позволяет легко применить паттерн «делегирование». Самый частый пример — ленивая инициализация:
val heavyObject: HeavyClass by lazy {
println("Инициализация...")
HeavyClass()
}
Пока свойство не понадобится, объект создаваться не будет. Это удобно для ресурсоёмких компонентов. Также вы можете создавать собственные делегаты свойств, чтобы централизовать логику проверки или форматирования.
Null-безопасность: меньше страха перед NPE
При kotlin программирование на примерах вы практически не встретите NullPointerException, потому что язык заставляет обрабатывать потенциальные null значения на этапе компиляции.
var city: String? = null
// println(city.length) // ошибка компиляции
println(city?.length) // безопасный вызов, вернёт null
val length = city?.length ?: 0 // элвис-оператор
city?.let { println("Город: $it") } // выполнится только если не null
Совет: практикуйтесь в интерактивной среде
Чтобы быстрее освоить kotlin программирование на примерах, используйте Kotlin Playground (https://play.kotlinlang.org) или REPL в IntelliJ IDEA. Скопируйте любой из приведённых примеров, запустите и экспериментируйте с изменениями — именно так формируется навык.
Заключение
Примеры из этой статьи — лишь начало. За ними стоят сотни возможностей: дженерики, sealed-классы, flow для реактивности, создание DSL и многое другое. Но главное вы уже поняли: kotlin программирование на примерах позволяет сразу видеть результат, убирает рутину и помогает писать надёжный код, который легко читать и поддерживать. Берите фрагменты из статьи, запускайте и дописывайте под свои задачи — это лучший способ войти в мир Kotlin.