A Kotlin egy erőteljes programozási nyelv, amely már a dobozból is számos funkciót biztosít. A Kotlin igazi ereje azonban a kiterjesztési funkcióiban rejlik, amelyek lehetővé teszik a fejlesztők számára, hogy funkcionalitást adjanak a meglévő osztályokhoz és objektumokhoz anélkül, hogy alosztályoznák vagy módosítanák a forráskódjukat. Íme 10 hasznos Kotlin-bővítmény, amelyek tömörebbé és olvashatóbbá teszik a kódot.

Itt van a 10 Kotlin bővítmény, amelyet rendszeresen használok a projektjeimben, és azt javaslom, hogy minden Android-fejlesztőnek használnia kell a kódját.

withNotNull —
Az egyik gyakori probléma, amellyel a fejlesztők találkoznak, amikor nullálható értékekkel dolgoznak, hogy a műveletek végrehajtása előtt ellenőrzik a null értékét. A withNotNull kiterjesztési függvény leegyszerűsíti ezt a folyamatot azáltal, hogy a fejlesztők csak akkor hajthatnak végre egy kódblokkot, ha az érték nem null.

inline fun <T : Any, R> T?.withNotNull(block: (T) -> R): R? {
    return this?.let(block)
}

Felhasználások: -

val nullableValue: String? = null
nullableValue.withNotNull { value ->
    // Code here will only be executed if nullableValue is not null
}

toLiveData —
A LiveData egy adathordozó osztály, amely életciklus-tudatos, és megfigyelhető a változásokra. A toLiveData kiterjesztés funkció leegyszerűsíti a folyamat LiveData konvertálását.

fun <T> Flow<T>.toLiveData(): LiveData<T> {
    return liveData {
        collect {
            emit(it)
        }
    }
}

Használat: -

val flow = flowOf("Hello", "World")
val liveData = flow.toLiveData()

notEmpty —
A notEmpty kiterjesztés funkció leegyszerűsíti annak ellenőrzését, hogy egy gyűjtemény nem üres-e.

fun <T> Collection<T>?.notEmpty(): Boolean {
    return this != null && this.isNotEmpty()
}

Tömörebben — Köszönöm @richard.green_70881, hogy rámutatott

fun <T> Collection<T>?.notEmpty(): Boolean {
    return this?.isNotEmpty() == true
}

Használat: -

val list: List<Int> = emptyList()
if (list.notEmpty()) {
    // Code here will only be executed if list is not empty
}

getOrThrow
A getOrThrow kiterjesztés funkció leegyszerűsíti az érték lekérését a térképről, és kivételt ad, ha a kulcs nem található.

fun <K, V> Map<K, V>.getOrThrow(key: K): V {
    return this[key] ?: throw NoSuchElementException("Key $key not found in map")
}

Használat: -

val map = mapOf("key1" to "value1", "key2" to "value2")
val value = map.getOrThrow("key3")

toFormattedString —
A toFormattedString kiterjesztés funkció leegyszerűsíti a számok és dátumok formázásának folyamatát.

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)
}

Használat: -

val number = 1000000
val formattedNumber = number.toFormattedString()

debounce —
A visszafordulás-kiterjesztés funkció leegyszerűsíti egy kódblokk végrehajtásának késleltetési folyamatát, amíg a blokk legutóbbi végrehajtása óta meghatározott idő el nem telik.

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)
        }
    }
}

Használat: -

button.onClick(debounceDuration = 500L) {
    // Code here will only be executed if 500 milliseconds have passed since the last click
}

toBitmap —
A toBitmap kiterjesztés funkció leegyszerűsíti a rajzolható bittérképpé konvertálás folyamatát.

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
}

Használat: -

val drawable = ContextCompat.getDrawable(context, R.drawable.my_drawable)
val bitmap = drawable.toBitmap()

toUri —
A toUri kiterjesztés funkció leegyszerűsíti a fájl elérési útjának Uri-vá alakításának folyamatát.

fun String.toUri(): Uri {
    return Uri.parse(this)
}

Használat: -

val filePath = "/storage/emulated/0/Download/my_file.pdf"
val fileUri = filePath.toUri()

applyIf —
Az applyIf kiterjesztési függvény leegyszerűsíti a kódblokk objektumra történő alkalmazásának folyamatát, ha egy feltétel teljesül.

inline fun <T> T.applyIf(condition: Boolean, block: T.() -> Unit): T {
    return if (condition) {
        this.apply(block)
    } else {
        this
    }
}

Használata: -

val number = 5
val formattedNumber = number.applyIf(number > 10) {
    toFormattedString()
}

Összefoglalva, a Kotlin kiterjesztés funkciói hatékony eszközt jelenthetnek a kód egyszerűsítésére és olvashatóbbá tételére. Ennek a 10 hasznos bővítménynek a kihasználásával tömörebbé, hatékonyabbá és karbantarthatóbbá teheti kódját.