Irbisa · Шпаргалка
Основы Kotlin
val/var, типы, null safety, control flow, функции, лямбды
Какие преимущества у Kotlin перед Java в Android-разработке и какие у него недостатки?
В чём разница между
val,varиconst valв Kotlin?val name = "Ada" // type inferred as String// name = "Bob" // compile error: val cannot be reassigned var attempts = 0attempts += 1 // fine…Как работает null safety в Kotlin: nullable-типы,
?.,?:,!!иlet?fun greet(user: User?) { val city = user?.address?.city // String?: null if any link is null val name = user?.name ?: "Guest" // fallback value user?.let { analytics.track(it.id) } // runs only when user != null if (user == null) return…Что напечатает
describe(null)в этом коде, построчно?fun describe(name: String?) { println(name?.length) println(name?.length ?: -1) println(name.isNullOrEmpty()) println("Hello, $name") println(name!!.length)} fun main() { describe(null)}lateinitилиby lazy: когда что использовать и как проверить, чтоlateinit-свойство инициализировано?@AndroidEntryPointclass ProfileActivity : AppCompatActivity() { @Inject lateinit var repo: UserRepository // assigned by Hilt private lateinit var binding: ActivityProfileBinding private val dateFormat by lazy { // created on first use…В чём разница между
==и===в Kotlin?data class User(val id: Int, val name: String) val a = User(1, "Ada")val b = User(1, "Ada")println(a == b) // true: equals() compares propertiesprintln(a === b) // false: two different objects…Как
whenработает как выражение в Kotlin и когда он обязан быть исчерпывающим?sealed interface UiState { data object Loading : UiState data class Content(val items: List<String>) : UiState data class Error(val message: String) : UiState}…Как работают диапазоны в Kotlin:
..,..<,until,downToиstep?val items = listOf("a", "b", "c") // for (i in 0..items.size) println(items[i]) // wrong: crashes when i == 3for (i in 0..<items.size) println(items[i]) // end excludedfor (i in 0 until items.size) println(items[i]) // same, older spellingfor (i in items.indices) println(items[i])…Что такое лямбды и функции высшего порядка в Kotlin и во что компилируется лямбда?
// Higher-order function: takes a function as a parameterfun retry(times: Int, block: () -> Boolean): Boolean { repeat(times) { if (block()) return true } return false}…Что напечатает этот код со счётчиком и где живёт
countпосле того, какmakeCounter()вернула управление?fun makeCounter(): () -> Int { var count = 0 return { ++count }} fun main() { val first = makeCounter() val second = makeCounter() println(first()) println(first()) println(second())}Как работают аргументы по умолчанию и именованные аргументы в Kotlin и как они заменяют паттерн Builder?
data class Request( val url: String, val method: String = "GET", val timeoutMs: Long = 10_000, val headers: Map<String, String> = emptyMap(),)…В чём разница между
ListиMutableList, а также междуvalс изменяемым списком иvarсо списком только для чтения?class Cart { private val _items = mutableListOf<String>() // mutable inside val items: List<String> get() = _items // read-only outside fun add(item: String) { _items += item }}…Что делают
map,flatMap,fold,reduce,groupBy,associateBy,partitionиzipнад коллекцией в Kotlin?data class Order(val id: Int, val user: String, val total: Long, val items: List<String>) val orders = listOf( Order(1, "ada", 300, listOf("pen", "ink")), Order(2, "bob", 0, emptyList()), Order(3, "ada", 150, listOf("paper")),…Когда использовать
ArrayвместоListи почемуarrayOf(1, 2) == arrayOf(1, 2)возвращает false?val a = arrayOf(1, 2)val b = arrayOf(1, 2)println(a == b) // false: reference comparisonprintln(a.contentEquals(b)) // trueprintln(a.contentToString()) // [1, 2]println(listOf(1, 2) == listOf(1, 2)) // true…Как работают деструктурирующие объявления в Kotlin?
data class Size(val width: Int, val height: Int) val (w, h) = Size(1080, 1920) // component1(), component2() val prices = mapOf("apple" to 3, "pear" to 5)for ((fruit, price) in prices) println("$fruit costs $price")…Почему сборка строки через
+=в цикле медленная и что использовать вместо неё?// wrong: a new String on every iteration, O(n²) copyingvar csv = ""for (u in users) csv += u.name + "," // right: one bufferval csvFast = buildString {…Что такое smart cast в Kotlin, когда компилятор от него отказывается и чем отличаются
asиas??fun describe(x: Any): String { if (x is String) return "text of ${x.length}" // smart cast to String if (x !is Int) return "unknown" return "number ${x + 1}" // smart cast to Int}…Найдите баг: залогиненный пользователь, впервые открывший профиль, тоже видит баннер для гостей.
data class User(val id: String, val name: String) class ProfileScreen { private val lastSeenName = mutableMapOf<String, String>() fun render(user: User?) { user?.let { lastSeenName.put(it.id, it.name) } ?: showGuestBanner() showGreeting(user?.name ?: "guest") } private fun showGuestBanner() = println("Sign in to sync your progress") private fun showGreeting(name: String) = println("Hello, $name")}Может ли
val-свойство возвращать разное значение при каждом чтении?class Basket { private val items = mutableListOf<Item>() val size: Int get() = items.size // no backing field, recomputed val isEmpty: Boolean get() = size == 0…Найдите баг: после того как один пользователь вышел, а другой вошёл, все запросы падают с 401 до перезапуска приложения.
data class Request(val path: String, val headers: Map<String, String>) class Session { var token: String? = null // replaced on every login} class ApiClient(private val session: Session) { // one instance for the app private val authHeader by lazy { "Bearer ${session.token}" } fun request(path: String): Request = Request(path, headers = mapOf("Authorization" to authHeader))}Есть ли в Kotlin примитивные типы и когда
Intбоксируется?val count: Int = 42 // int on the JVMval maybe: Int? = 42 // java.lang.Integer: nullable means boxedval list: List<Int> = listOf(1, 2) // List<Integer>: generics always boxval raw = IntArray(1_000) // int[], no boxing // val total: Long = count // compile error: no implicit widening…Что такое
Any,UnitиNothingв Kotlin и сколько экземпляров каждого может существовать?fun log(message: String) { // returns Unit implicitly println(message)}val onDone: () -> Unit = { log("done") } fun fail(message: String): Nothing = throw IllegalArgumentException(message)…Есть ли в Kotlin checked exceptions и как тогда сообщать об ошибках и обрабатывать их?
sealed interface LoginResult { data class Success(val user: User) : LoginResult data object WrongPassword : LoginResult data object Offline : LoginResult}…Что напечатает этот код с
forEachи как сделать, чтобы он пропускал только пробельный элемент?fun printVisible(items: List<String>) { items.forEach { if (it.isBlank()) return println(it) } println("done")} fun main() { printVisible(listOf("a", " ", "b"))}