Программирование
9 полезных функций расширения Kotlin
Используя эти 9 полезных расширений, вы сможете сделать свой код более лаконичным, эффективным и удобным для сопровождения.
Kotlin — это мощный язык программирования, который предоставляет много функциональных возможностей из коробки. Однако истинная сила Kotlin заключается в его функциях расширения, которые позволяют разработчикам добавлять функциональность к существующим классам и объектам без создания подклассов или изменения исходного кода. Вот 10 полезных расширений Kotlin, которые сделают ваш код более лаконичным и читабельным.
withNotNull
Одна из распространенных проблем, с которой сталкиваются разработчики при работе с нулевыми значениями, — это проверка на null перед выполнением операций. Функция расширения withNotNull упрощает этот процесс, позволяя разработчикам выполнять блок кода только в том случае, если значение не является null.
xxxxxxxxxx
inline fun <T : Any, R> T?.withNotNull(block: (T) -> R): R? {
return this?.let(block)
}
Использование:
xxxxxxxxxx
val nullableValue: String? = null
nullableValue.withNotNull { value ->
// Code here will only be executed if nullableValue is not null
}
toLiveData
LiveData — это data holder класс, который учитывает жизненный цикл и может быть наблюдаем. Функция расширения toLiveData упрощает процесс преобразования Flow в LiveData.
xxxxxxxxxx
fun <T> Flow<T>.toLiveData(): LiveData<T> {
return liveData {
collect {
emit(it)
}
}
}
Использование:
xxxxxxxxxx
val flow = flowOf("Hello", "World")
val liveData = flow.toLiveData()
notEmpty
Функция расширения notEmpty упрощает процесс проверки того, не пуста ли коллекция.
xxxxxxxxxx
fun <T> Collection<T>?.notEmpty(): Boolean {
return this != null && this.isNotEmpty()
}
Более лаконичный способ:
xxxxxxxxxx
fun <T> Collection<T>?.notEmpty(): Boolean {
return this?.isNotEmpty() == true
}
Использование:
xxxxxxxxxx
val list: List<Int> = emptyList()
if (list.notEmpty()) {
// Code here will only be executed if list is not empty
}
getOrThrow
Функция расширения getOrThrow упрощает процесс получения значения из карты и выбрасывает исключение, если ключ не найден.
xxxxxxxxxx
fun <K, V> Map<K, V>.getOrThrow(key: K): V {
return this[key] ?: throw NoSuchElementException("Key $key not found in map")
}
Использование:
xxxxxxxxxx
val map = mapOf("key1" to "value1", "key2" to "value2")
val value = map.getOrThrow("key3")
toFormattedString
Функция расширения toFormattedString упрощает процесс форматирования чисел и дат.
xxxxxxxxxx
fun Int.toFormattedString(): String {
return NumberFormat.getInstance().format(this)
}
fun Long.toFormattedString(): String {
return NumberFormat.getInstance().format(this)
}
fun Date.toFormattedString(): String {
return SimpleDateFormat.getDateInstance().format(this)
}
Использование:
xxxxxxxxxx
val number = 1000000
val formattedNumber = number.toFormattedString()
debounce
Debounce упрощает процесс задержки выполнения блока кода до тех пор, пока не пройдет определенное количество времени с момента последнего выполнения блока.
xxxxxxxxxx
fun View.onClick(debounceDuration: Long = 300L, action: (View) -> Unit) {
setOnClickListener(DebouncedOnClickListener(debounceDuration) {
action(it)
})
}
private class DebouncedOnClickListener(
private val debounceDuration: Long,
private val clickAction: (View) -> Unit
) : View.OnClickListener {
private var lastClickTime: Long = 0
override fun onClick(v: View) {
val now = SystemClock.elapsedRealtime()
if (now - lastClickTime >= debounceDuration) {
lastClickTime = now
clickAction(v)
}
}
}
Использование:
xxxxxxxxxx
button.onClick(debounceDuration = 500L) {
// Code here will only be executed if 500 milliseconds have passed since the last click
}
toBitmap
Функция расширения toBitmap упрощает процесс преобразования drawable в растровое изображение.
xxxxxxxxxx
fun Drawable.toBitmap(): Bitmap {
if (this is BitmapDrawable) {
return bitmap
}
val bitmap = Bitmap.createBitmap(intrinsicWidth, intrinsicHeight, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
setBounds(0, 0, canvas.width, canvas.height)
draw(canvas)
return bitmap
}
Использование:
xxxxxxxxxx
val drawable = ContextCompat.getDrawable(context, R.drawable.my_drawable)
val bitmap = drawable.toBitmap()
toUri
Функция упрощает процесс преобразования пути к файлу в Uri.
xxxxxxxxxx
fun String.toUri(): Uri {
return Uri.parse(this)
}
Использование:
xxxxxxxxxx
val filePath = "/storage/emulated/0/Download/my_file.pdf"
val fileUri = filePath.toUri()
applyIf
ApplyIf упрощает процесс применения блока кода к объекту только при выполнении определенного условия.
xxxxxxxxxx
inline fun <T> T.applyIf(condition: Boolean, block: T.() -> Unit): T {
return if (condition) {
this.apply(block)
} else {
this
}
}
Использование:
xxxxxxxxxx
val number = 5
val formattedNumber = number.applyIf(number > 10) {
toFormattedString()
}
В заключение следует отметить, что функции расширения Kotlin могут стать мощным инструментом для упрощения кода и повышения его читабельности. Используя эти 10 полезных расширений, вы сможете сделать свой код более лаконичным, эффективным и удобным для сопровождения.
-
Видео и подкасты для разработчиков4 недели назад
Как устроена мобильная архитектура. Интервью с тех. лидером юнита «Mobile Architecture» из AvitoTech
-
Новости4 недели назад
Видео и подкасты о мобильной разработке 2025.10
-
Новости3 недели назад
Видео и подкасты о мобильной разработке 2025.11
-
Видео и подкасты для разработчиков2 недели назад
Javascript для бэкенда – отличная идея: Node.js, NPM, Typescript