當前位置:網站首頁>kotlin不容忽視的小細節

kotlin不容忽視的小細節

2022-01-28 13:24:22 碼農樂園

kotlin支持擴展函數

Kotlin的擴展函數可以讓你作為一個類成員進行調用的函數,但是是定義在這個類的外部。這樣可以很方便的擴展一個已經存在的類,為它添加額外的方法。

rxjava線程切換:

fun <T> Observable<T>.setThread(): Observable<T> {
    return subscribeOn(Schedulers.io())
         .observeOn(AndroidSchedulers.mainThread())
}
findViewById:
fun <V : View> Activity.bindView(id: Int): Lazy<V> {
    return lazy { findViewById<V>(id) }
}
更加通用的自定義錶達式:
fun <T> T.checkExpression(expression: Boolean, function: T.() -> T): T {
    if (expression) {
        function.invoke(this)
    }
    return this
}

還可以定義些通用函數

/**
 * int px轉dp
 */
fun Int.toDp(): Int{
    val scale = App.context.resources.displayMetrics.density
    return (this * scale + 0.5f).toInt()
}




/**
 * float px轉dp
 */
fun Float.toDp(): Float{
    val scale = App.context.resources.displayMetrics.density
    return this * scale + 0.5f
}




/**
 * List<T>轉Map<K,T>,獲取對數據
 */
inline fun <K,T> Iterable<T>.toMap(transform: (T) -> K): MutableMap<K, T>{
    val map = mutableMapOf<K, T>()
    forEach {
        map[transform.invoke(it)] = it
    }
    return map
}




/**
 * List<T>轉List<R>
 */
inline fun <T, R> Iterable<T>.convert(transform: (T) -> R): Iterable<R>{
    val list = mutableListOf<R>()
    forEach {
        list.add(transform.invoke(it))
    }
    return list
}

協程

類似於線程,但是占用內存更低且更高效,同時在協程中執行代碼,是順序執行,而java 線程需要通過回調。

// do first: main
    // do async: DefaultDispatcher-worker-5
    // do end: main
    GlobalScope.launch(Dispatchers.Main) {
        println("do first: ${Thread.currentThread().name}")
        GlobalScope.async(Dispatchers.Default) {
            println("do async: ${Thread.currentThread().name}")
        }.await()
        println("do end: ${Thread.currentThread().name}")
    }
kotlin的lambda錶達式規則

不用lambda錶達式:

// 這裏舉例一個Android中最常見的按鈕點擊事件的例子
mBtn.setOnClickListener(object : View.OnClickListener{
        override fun onClick(v: View?) {
            Toast.makeText(this,"onClick",Toast.LENGTH_SHORT).show()
        }
    })
等價於:
// 調用
mBtn.setOnClickListener { v -> Toast.makeText(this,"onClick",Toast.LENGTH_SHORT).show() }
特性如下:
  • 錶達式總是被大括號括著

  • 其參數(如果存在)在 -> 之前聲明(參數類型可以省略)

  • 函數體(如果存在)在 -> 後面

相比java8的lambda錶達式,還有其他特性:

當方法中最後一個參數為函數類型,則可以放在大括號調用

fun lambdaFun(boolean: Boolean, block: (Int) -> Unit){
  
}


fun lambdaFunTest(){
    lambdaFun(true, block = {
        
    })
    
    lambdaFun(true){
        
    }


}
it

it是在當一個高階函數中Lambda錶達式的參數只有一個的時候可以使用it來使用此參數。it可錶示為單個參數的隱式名稱,是Kotlin語言約定的。

val arr = arrayOf(1,3,5,7,9)
// 過濾掉數組中元素小於2的元素,取其第一個打印。這裏的it就錶示每一個元素。
println(arr.filter { it < 5 })

f5879fba540a6386ae6a2af144896f4e.png

版權聲明
本文為[碼農樂園]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201281324216913.html