Почему Kotlin — это не просто "ещё один язык для JVM"?
Когда в 2016 году JetBrains выпустила Kotlin, мало кто мог предсказать, что через несколько лет этот язык станет стандартом для Android-разработки и одним из главных претендентов на трон в мире backend. Сегодня Kotlin — это не просто синтаксический сахар над Java. Это мощная экосистема, где каждая библиотека решает конкретную задачу элегантно и с минимальным количеством бойлерплейта.
В этой статье мы разберём самые популярные Kotlin библиотеки, которые реально упрощают жизнь разработчику. Мы не будем перечислять все подряд — только то, что стоит изучить прямо сейчас. Поехали!
1. Ktor — ваш новый HTTP-клиент и сервер
Если вы ищете лёгкий, асинхронный и полностью конфигурируемый HTTP-клиент (или даже сервер) — Ktor станет вашим лучшим другом. В отличие от тяжеловесного Spring Boot, Ktor не навязывает архитектуру. Вы сами решаете, какие модули подключать.
Пример: HTTP-клиент для получения данных
import io.ktor.client.*
import io.ktor.client.engine.cio.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
suspend fun main() {
val client = HttpClient(CIO)
val response: HttpResponse = client.get("https://api.github.com/repos/jetbrains/kotlin")
println("Статус: ${response.status}")
println("Тело: ${response.bodyAsText()}")
client.close()
}
Ktor поддерживает плагины для сериализации, сжатия, логирования и аутентификации. Это одна из самых популярных Kotlin библиотек для работы с сетью.
2. Kotlinx.serialization — сериализация без боли
Забудьте про Gson и Jackson. Kotlinx.serialization работает на уровне компилятора, а не рефлексии. Это даёт прирост производительности и полную типобезопасность.
Пример: сериализация data класса в JSON
import kotlinx.serialization.*
import kotlinx.serialization.json.*
@Serializable
data class User(val name: String, val age: Int)
fun main() {
val user = User("Анна", 28)
val jsonString = Json.encodeToString(user)
println(jsonString) // {"name":"Анна","age":28}
val decoded = Json.decodeFromString<User>(jsonString)
println(decoded) // User(name=Анна, age=28)
}
Библиотека поддерживает полиморфизм, пользовательские сериализаторы и работу с JSON, XML, CBOR и даже YAML. Это must-have для любого Kotlin-проекта.
3. Koin — внедрение зависимостей без магии
Dagger? Hilt? Тяжело, много кода. Koin предлагает простой DSL для DI, написанный на чистом Kotlin. Никакой генерации кода, никаких аннотаций — только функции.
Пример: простой модуль и внедрение
import org.koin.core.context.startKoin
import org.koin.dsl.module
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
class Repository
class Service(private val repo: Repository) {
fun doWork() = "Работаю с ${repo}"
}
val myModule = module {
single { Repository() }
factory { Service(get()) }
}
fun main() {
startKoin { modules(myModule) }
val service: Service = object : KoinComponent {}.inject()
println(service.doWork())
}
Koin идеально подходит для средних и небольших проектов, где не хочется переплачивать за сложность.
4. Exposed — ORM для тех, кто не любит ORM
Большинство ORM скрывают SQL, но Exposed действует иначе: он остаётся близок к SQL, но даёт удобный DSL на Kotlin. Вы пишете на Kotlin, а получаете чистый SQL с автодополнением.
Пример: создание таблицы и запрос
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.transactions.transaction
object Users : Table() {
val id = integer("id").autoIncrement()
val name = varchar("name", 50)
override val primaryKey = PrimaryKey(id)
}
fun main() {
Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver")
transaction {
SchemaUtils.create(Users)
Users.insert { it[name] = "Котлин" }
val query = Users.selectAll().single()
println("ID: ${query[Users.id]}, Name: ${query[Users.name]}")
}
}
Exposed поддерживает транзакции, джойны, агрегатные функции и миграции через Flyway. Это одна из Kotlin библиотек, которую стоит освоить каждому backend-разработчику.
5. Kotlin Coroutines — асинхронность без коллбэков
Хотя корутины — это часть языка, библиотека kotlinx.coroutines предоставляет готовые инструменты для работы с потоками, каналами и Flow. Это фундамент, на котором строится вся асинхронная экосистема Kotlin.
Пример: параллельные запросы
import kotlinx.coroutines.*
suspend fun fetchData(id: Int): String {
delay(1000) // имитация сетевого запроса
return "Данные для ID=$id"
}
fun main() = runBlocking {
val results = (1..5).map { id ->
async { fetchData(id) }
}
println(results.awaitAll()) // [Данные для ID=1, ..., Данные для ID=5]
}
Без корутин сейчас невозможно представить ни один серьёзный проект на Kotlin. Они используются в Ktor, Exposed, Android и даже в Spring.
6. Arrow — функциональное программирование в массы
Хотите писать на Kotlin как на Haskell или Scala? Arrow привносит в язык функциональные конструкции: Option, Either, Validated, эффектные типы и монады. Это не просто библиотека, это целый фреймворк для функционального программирования.
Пример: обработка ошибок с Either
import arrow.core.*
fun divide(a: Int, b: Int): Either<String, Int> =
if (b == 0) Either.Left("Деление на ноль")
else Either.Right(a / b)
fun main() {
val result = divide(10, 2)
result.fold(
{ left -> println("Ошибка: $left") },
{ right -> println("Результат: $right") }
)
}
Arrow — это выбор тех, кто ценит предсказуемость и композиционность кода.
7. MockK — моки для Kotlin, а не для Java
Mockito хорош, но он заточен под Java. MockK понимает Kotlin: он работает с корутинами, data классами, sealed классами и extension-функциями. И да, он поддерживает релаксированные моки и слоты.
Пример: мок с корутиной
import io.mockk.*
class Service {
suspend fun call(): String = "real"
}
fun main() {
val mock = mockk<Service>()
coEvery {