Kotlin系列七:靜態方法、infix函數、高階函數的常見應用舉例

 

一 靜態方法

java中定義靜態方法只需要在方法前添加static即可;

kotlin中有四種方式:object的單例類模式、companion object(可以局部寫靜態方法)、JvmStatic註解模式、頂層函數模式。

1.1 object

用object修飾的類,實際上是單例類,在Kotlin中調用時是類名加方法直接使用。

object Util {
    fun doAction(){
        Log.v("TAG","doAction")
    }
}
 
//kotlin中調用
Util.doAction()
 
//java中調用 INSTANCE是Util的單例類
Util.INSTANCE.doAction();
 

3.2 companion object

用companion object修飾的方法也能通過類名加.直接調用,但是這時通過伴生對象實現的。它的原理是在原有類中生成一個伴生類,Kotlin會保證這個伴生類只有一個對象。

class Util{
    //此處是單例類可以調用的地方
    companion object {
        fun doAction(){
            Log.v("TAG","doAction")
        }
    }
    //此處是普通方法
    fun doAction2(){
        Log.v("TAG","doAction")
    }
}
 
//kotlin調用
Util.doAction()
 
//java調用,Companion是單例類
Util.Companion.doAction();

3.3 @JvmStatic註解

給單例類(object)和伴生對象的方法加@JvmStatic註解,這時編譯器會將這些方法編譯成真正的靜態方法。

注意:JvmStatic只能註釋在單例類或companion object中的方法上。

class Util{
    //此處是單例類可以調用的地方
    companion object {
        @JvmStatic
        fun doAction(){
            Log.v("TAG","doAction")
        }
    }
 
    //此處是普通方法
    fun doAction2(){
        Log.v("TAG","doAction")
    }
 
}
 
//kotlin中的調用
Util.doAction()
 
//java中的調用,成爲了真正的單例類
Util.doAction();

3.4 頂層方法

頂層函數是指那些沒有定義在任何類中的函數,寫在任何類的外層即可,kotlin會將所有頂層函數編譯成靜態方法,可以在任何位置被直接調用。

//在類的外部
fun doAction(){
}
class Util {  
}
 
//kotlin調用方式
doAction()
 
//java調用方式,真正的靜態方法
UtilKt.doAction();

 二 infix函數

infix函數作用:將函數調用的語法修改了一下。

比如:A to B 等於 A.to(B)。

實現方式:在函數前面加上infix即可。

限制條件:1.不能是頂層函數;2.參數只能有一個。

例子:

infix fun String.beginsWith(p:String) = startsWith(p)

三 利用高階函數簡化常用API

apply函數簡化intent.putExtra():

 fun SharedPreferences.open(block: SharedPreferences.Editor.() -> Unit) {
        val editor = edit()
        editor.block()
        editor.apply()
    }
    
 
使用:
     getSharedPreferences("user", Context.MODE_PRIVATE).open {
            putString("username", "Lucas")
            putBoolean("graduated", false)
        }

簡化SharedPreferences:

 fun SharedPreferences.open(block: SharedPreferences.Editor.() -> Unit) {
        val editor = edit()
        editor.block()
        editor.apply()
    }
    
 
使用:
     getSharedPreferences("user", Context.MODE_PRIVATE).open {
            putString("username", "Lucas")
            putBoolean("graduated", false)
        }

簡化ContentValues:

fun cvOf(vararg pairs: Pair<String, Any?>) =  ContentValues().apply {
        for(pair in pairs){
            val key = pair.first
            val value = pair.second
            when(value){
                is Int -> put(key, value)
                is Long -> put(key, value)
                is Short -> put(key, value)
                is Float -> put(key, value)
                is Double -> put(key, value)
                is Boolean -> put(key, value)
                is String -> put(key, value)
                is Byte -> put(key, value)
                is ByteArray -> put(key, value)
                null -> putNull(key)
            }
        }
    }

懶加載技術實現lazy():

  fun <T> later(block: () -> T) = Later(block)
 
    class Later<T>(val block: () -> T){
        var value: Any? = null
 
        operator fun getValue(any: Any?, prop: KProperty<*>): T{
            if (value == null){
                value = block
            }
            return value as T
        }
    }
 
使用:
    val haha:String by later {
        "hhaa"
    }

泛型實化簡化startActivity()並附帶intent傳值:

    
    inline fun <reified T> startActivity(context: Context, block: Intent.() -> Unit){
        val intent = Intent(context, T::class.java)
        intent.block()
        context.startActivity(intent)
    }
使用:
  startActivity<MainActivity>(this){
        putExtra("haha","1111")
        putExtra("hahaaaa","1111")
    }

簡化N個數的最大值最小值:

   fun <T : Comparator<T>> MyMax(vararg nums: T): T{
        if (nums.isEmpty()) throw RuntimeException("params can not be empty")
        var maxNum = nums[0]
        for (num in nums){
            if (num > maxNum){
                maxNum = num
            }
        }
        return maxNum
    } 
 
使用:
       val a = 1
        val b = 3
        val c = 2
        val largest = MyMax(a,b,c)

簡化Toast:

   
    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()
    }
 
用法:
        "ahah".showToast(this, Toast.LENGTH_LONG)

簡化Snackbar:

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(text: String, actionResId: Int?=null, duration: Int = Snackbar.LENGTH_SHORT, block: (() -> Unit)? =null){
        val snackbar = Snackbar.make(this, text, duration)
        if (actionResId != null && block != null){
            snackbar.setAction(actionResId){
                block()
            }
        }
        snackbar.show()
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章