本篇文章主要介紹以下幾個(gè)知識(shí)點(diǎn):
- 求 N 個(gè)數(shù)的最大最小值
- 簡化 Toast 的用法
- 簡化 Snackbar 的用法
內(nèi)容參考自第一行代碼第3版
1. 求 N 個(gè)數(shù)的最大最小值
Kotlin 提供的豐富語法特性給我們提供了無限的擴(kuò)展可能规阀,各種復(fù)雜的 API 經(jīng)過特殊的封裝處理之后能變得簡單易用帝璧。
兩個(gè)數(shù)比較大小沪哺,除了用 if
語句外,可以用 Kotlin 內(nèi)置的 max()
函數(shù),如下:
val a =10
val b =12
val larger = max(a, b)
若是比較3個(gè)數(shù)中的最大值拖叙,可以這么寫:
val a = 10
val b = 12
val c = 15
val largest = max(max(a, b), c)
若是獲取 N 個(gè)數(shù)中的最大值紊撕,就需要對(duì) max()
方法進(jìn)行簡化了:
// 關(guān)鍵字 vararg 表示可以接收任意多個(gè)參數(shù)
fun max(vararg numbs: Int): Int {
var maxNum = Int.MIN_VALUE
for (num in numbs) {
maxNum = max(maxNum, num)
}
return maxNum
}
這樣,比較3個(gè)數(shù)中的最大值就可以寫成:
val largest = max(a, b, c)
此時(shí)若還想求 N 個(gè)浮點(diǎn)型或長整型數(shù)字的最大值憨募,就不能滿足了紧索,當(dāng)然可以定義多個(gè) max()
函數(shù)的重載,但這樣實(shí)現(xiàn)起來過于繁瑣菜谣,這里介紹一種更加巧妙的方法珠漂。
在 Java 中晚缩,實(shí)現(xiàn) Comparable
接口后所有類型的數(shù)字是可比較的,在 Kotlin 中同樣如此媳危,借助泛型修改 max()
函數(shù)如下:
// 將泛型 T 的上界指定成 Comparable<T>荞彼, 使參數(shù) T 是 Comparable<T> 的子類型
fun <T : Comparable<T>> max(vararg numbs: T): T {
if (numbs.isEmpty()) throw RuntimeException("params can not be empty")
var maxNum = numbs[0]
for (num in numbs) {
if (num > maxNum) maxNum = num
}
return maxNum
}
這樣就可以比較多個(gè)浮點(diǎn)型的數(shù)字了:
val a = 3.5
val b = 4.5
val c = 5.5
val largest = max(a, b, c)
2. 簡化 Toast 的用法
平時(shí)用 Toast
一般如下寫法:
Toast.makeText(context, "text", Toast.LENGTH_SHORT).show()
可以給 String 和 Int 類添加擴(kuò)展函數(shù),在里面封裝彈出 Toast
的具體邏輯如下:
fun String.showToast(context: Context) {
Toast.makeText(context, this, Toast.LENGTH_SHORT).show()
}
fun Int.showToast(context: Context) {
Toast.makeText(context, this, Toast.LENGTH_SHORT).show()
}
這樣待笑,彈出文字提醒就可以這么寫了:
"text".showToast(context)
R.string.app_name.showToast(context)
當(dāng)然還可以進(jìn)一步優(yōu)化鸣皂,加入指定顯示時(shí)長,如下:
fun String.showToast(context: Context, duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(context, this, duration).show()
}
fun Int.showToast(context: Context, duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(context, this, duration).show()
}
3. 簡化 SnackBar 的用法
平時(shí)用 Snackbar
一般如下:
Snackbar.make(view, "text", Snackbar.LENGTH_SHORT).setAction("Action") {
// 具體邏輯
}.show()
可以給 View 類添加擴(kuò)展函數(shù)暮蹂,在里面封裝顯示 Snackbar
的具體邏輯如下:
fun View.showSnackBar(text: String, duration: Int = Snackbar.LENGTH_SHORT) {
Snackbar.make(this, text, duration).show()
}
fun View.showSnackBar(resId: Int, duration: Int = Snackbar.LENGTH_SHORT) {
Snackbar.make(this, resId, duration).show()
}
這樣寞缝,彈出文字提示就可這么寫了:
view.showSnackBar("text")
當(dāng)然還可以進(jìn)一步優(yōu)化,加入 setAction()
方法仰泻,如下:
fun View.showSnackBar(
text: String,
actionText: String? = null,
duration: Int = Snackbar.LENGTH_SHORT,
block: (() -> Unit)? = null
) {
val snackBar = Snackbar.make(this, text, duration)
if (actionText != null && block != null) {
snackBar.setAction(actionText) {
block()
}
}
snackBar.show()
}
fun View.showSnackBar(
resId: Int,
actionResId: Int? = null,
duration: Int = Snackbar.LENGTH_SHORT,
block: (() -> Unit)? = null
) {
val snackBar = Snackbar.make(this, resId, duration)
if (actionResId != null && block != null) {
snackBar.setAction(actionResId) {
block()
}
}
snackBar.show()
}
這樣荆陆,實(shí)現(xiàn)這小節(jié)最開始的那段代碼就可以寫成:
view.showSnackBar("text", "Action") {
// 具體邏輯
}
小結(jié):上面共編寫了3個(gè)方法,分別應(yīng)用了頂層函數(shù)集侯、擴(kuò)展函數(shù)被啼、高階函數(shù)的知識(shí),將 Kotlin 的許多特性靈活運(yùn)用棠枉,充分發(fā)揮出其優(yōu)勢趟据。
本篇文章就介紹到這。