Как пройти собеседование по Kotlin: топ вопросов от А до Я
Собеседование по Kotlin — это не просто проверка синтаксиса. Работодатели хотят видеть, что вы понимаете философию языка: нулевую безопасность, функциональный стиль, идиомы и особенности компиляции. В этой статье мы разобрали самые частые вопросы — от базовых до продвинутых. Подготовьтесь к интервью на 100%.
1. Базовые вопросы: синтаксис и null safety
Начинают собеседование обычно с основ. Вот что нужно знать обязательно.
Какие типы данных есть в Kotlin и чем они отличаются от Java?
Kotlin — статически типизированный язык. Все типы — объекты, нет примитивов (но компилятор может оптимизировать). Основные типы: Int, Double, Boolean, String, Array. В отличие от Java, в Kotlin нет new для создания объектов, а типы nullable явно помечаются знаком ?.
Что такое null safety и как Kotlin её реализует?
Null safety — встроенная защита от NullPointerException. Типы делятся на nullable (String?) и non-null (String). Для безопасного доступа используйте операторы:
val name: String? = null
println(name?.length) // безопасный вызов -> null
println(name?.length ?: 0) // элвис-оператор -> 0
println(name!!.length) // принуждение -> NPE, если null
Чем val отличается от var?
val— неизменяемая ссылка (read-only). Аналогfinalв Java.var— изменяемая ссылка (mutable).
Важно: val не гарантирует неизменяемость самого объекта, только ссылки.
2. Продвинутые конструкции: классы, функции и sealed
Здесь проверяют умение писать лаконичный и безопасный код.
Что такое data class и какие методы он генерирует?
data class — класс, предназначенный для хранения данных. Компилятор автоматически генерирует: equals(), hashCode(), toString(), copy(), и componentN().
data class User(val id: Int, val name: String)
val user = User(1, "Alice")
val copy = user.copy(name = "Bob")
println(user) // User(id=1, name=Alice)
Что такое sealed class и когда их использовать?
sealed class — ограниченная иерархия классов. Все подклассы должны быть объявлены в том же файле. Идеально для представления состояний (например, результат загрузки).
sealed class Result {
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()
object Loading : Result()
}
fun handle(result: Result) = when (result) {
is Result.Success -> println(result.data)
is Result.Error -> println(result.message)
Result.Loading -> println("Loading...")
}
Преимущество: when должен быть исчерпывающим — компилятор проверит все варианты.
Что такое extension functions и как они работают?
Extension functions позволяют добавить новый метод к существующему классу без наследования. На самом деле это статические функции, которые принимают экземпляр класса как первый аргумент.
fun String.isEmail(): Boolean = this.contains("@")
println("test@mail.ru".isEmail()) // true
3. Функциональное программирование: лямбды, коллекции, области видимости
Kotlin активно использует функциональный подход. Будьте готовы к вопросам про работу с коллекциями и скоуп-функции.
Какие скоуп-функции вы знаете? Чем они отличаются?
Основные: let, run, with, apply, also. Главное различие — контекст (this или it) и возвращаемое значение.
| Функция | Контекст | Возвращает |
|---|---|---|
let | it | результат лямбды |
run | this | результат лямбды |
with | this | результат лямбды |
apply | this | объект (контекст) |
also | it | объект (контекст) |
val numbers = mutableListOf(1,2,3)
numbers.apply { add(4) } // возвращает numbers
numbers.also { it.add(5) } // возвращает numbers
numbers.let { it.size } // возвращает Int
Как работают лямбды и функции высшего порядка?
Лямбда — анонимная функция. Функции высшего порядка принимают или возвращают лямбды. Пример:
fun operate(a: Int, b: Int, op: (Int, Int) -> Int): Int = op(a, b)
val sum = operate(5, 3) { x, y -> x + y }
println(sum) // 8
Часто используется it для одного параметра: list.filter { it > 0 }.
Какие методы работы с коллекциями наиболее популярны?
map— преобразование элементовfilter— фильтрация по условиюflatMap— разворачивание вложенных коллекцийfold/reduce— агрегацияgroupBy— группировка
val list = listOf(1,2,3,4,5)
val evenSquares = list.filter { it % 2 == 0 }.map { it * it }
println(evenSquares) // [4, 16]
4. Корутины и асинхронность
Корутины — одна из ключевых фич Kot