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.