Kotlin中的幾個常用函式let with run also apply

晴天大帥逼發表於2019-07-04

經常會用到的幾個擴充套件函式

1.let

用it代指自己,最後一行結果作為返回值,前面可以用?和!判空

@Test fun test(){
    val str = "test"
    val result =  str.let {
        println(it)
        "123"
    }
       println(result)
}
//輸出結果
test
123
複製程式碼

使用舉例

arguments?.let {
if (it.containsKey(CHOOSE_DATE) && it.containsKey(CHOOSE_STATE)) {
        attendanceTime = it.getString(CHOOSE_DATE)
        attendanceState = it.getString(CHOOSE_STATE)
   }
}
複製程式碼

2.with

with 需要傳入物件作為引數,函式體內可直接呼叫該物件的屬性方法,返回值為最後一行的結果,但不能同let一樣使用?和!判空
複製程式碼
@Test fun test(){
val str = "test"
val result =  with(str) {
println(length)
"123"
}
println(result)
//輸出結果
4
123
}
複製程式碼

使用舉例

with(UserInfoHelper) {
    saveValue(USERNAME, username)
    saveValue(DEPARTNAME, departname)
    saveValue(TOKEN, token)
    saveValue(ORGCODE, orgcode)
}
複製程式碼

3. run

可以看作with 和 let 的結合版 ,函式體內可以呼叫自身的屬性方法,可用this代指自己,最後一行結果作為返回值,前面可以用?和!判空
複製程式碼
@Test fun test(){
    val str = "test"
    val result =  str.run {
    println(length)
    "123"
    }
    println(result)
}
//輸出結果
4
123
複製程式碼

使用舉例

edt_password.setText(intent?.run { getStringExtra(PASSWORD) })
atv_phone.setText(intent?.run { getStringExtra(PHONE) })
複製程式碼

4.also

also同let函式類似,函式體內用it代指自己,區別在於返回值不同,also函式的返回值為自身
複製程式碼
 @Test fun test(){
 val str = "test"
 val result =  str.also{
 println(it)
 }
 println(result)
 }
 //輸出結果
 test
 test
複製程式碼

使用舉例


 val view = LayoutInflater.from(context).inflate(R.layout.monthly_choose_view, this, false).also {initView(it) }
 
 private fun initView(view: View) = with(view) {
     tv_last_month.setOnClickListener(this@MonthlyChoiceView)
     tv_next_month.setOnClickListener(this@MonthlyChoiceView)
     ...
 }
複製程式碼

5.apply

apply和run類似,函式體內可以直接呼叫自身的屬性方法,區別在於apply函式的返回值為自身
複製程式碼
@Test fun test(){
    val str = "test"
    val result =  str.apply{
    println(length)
    println(this)
    }
    println(result)
}
//輸出結果
4
test
test
複製程式碼

使用舉例

//畫筆
private val mPaint by lazy {
    Paint().apply {
        isAntiAlias = true
        color = Color.RED
        style = Paint.Style.FILL
        strokeWidth = 10f
    }
}

canvas?.drawCircle(innerCircleX, innerCircleY, innerCircleRadius, mPaint.apply { color = Color.WHITE })
複製程式碼

可以做個記錄,經常會用到,區別不大,只是作用域和返回值有差別,多用用自然就明白了

相關文章