Kotlin一些十分有用的方法(run、let、with、apply、also、repeat)

釣魚的小木匠發表於2018-12-29

在Kotlin上面,提供了不少可以幫助快速開發的方法。學習了之後發現,有這些方法,真的是太方便了。 可以看下,如果大家發現有什麼可以使用到的地方,儘管告知,一起學習,一起進步。

內聯擴充套件函式之run。直接訪問物件的屬性和方法,省去重複引用物件。

fun main(args: Array<String>) {
    val user = User("Kotlin", 1)

    val result = user.run {
        println("my name is $name, I am $age years old.")
        1000
    }
    println("result: $result")
}

        item.run {
        //直接訪問item的屬性和方法,避免方法的重複
            holder.tv?.setText(name)
            holder.ageTv?.setText(age.toString())
        }
複製程式碼

內聯擴充套件函式之let,當呼叫的物件不為null時才進行{}裡面的做法。 定義:let擴充套件函式的實際上是一個作用域函式,當你需要去定義一個變數在一個特定的作用域範圍內,let函式另一個作用就是可以避免寫一些判斷null的操作。

eg:
object?.let{//表示object不為null的條件下,才會去執行let函式體,注意有個?號在哦
//it.todo()//其中,it會用來代表object
}
複製程式碼

常用的場景就是使用let函式處理需要針對一個可null的物件統一做判空處理,或者需要去明確一個變數所處特定的作用域範圍內。

行內函數之with,返回的是傳入的物件本身。 定義:它接收一個物件和一個擴充套件函式作為它的引數,然後使這個物件擴充套件這個函式。 這表示所有我們在括號中編寫的程式碼都是作為物件(第一個引數)的一個擴充套件函式,我們可以就像作為this一樣使用所有它的public方法和屬性,可以省去類名重複,直接呼叫類的方法即可,例如RecyclerView中onBinderViewHolder中,需要對某個物件做統一的處理。

val result = with(person) {
        println("my name is $name, I am $age years old")
        1000
    }
with(item){
            holder.tv?.setText(name)//直接訪問item的屬性和方法
            holder.ageTv?.setText(age.toString())
        }
複製程式碼

內聯擴充套件函式之apply,apply函式的返回的是傳入物件的本身。 apply一般用於一個物件例項初始化的時候,需要對物件中的屬性進行賦值。例如inflate出一個XML佈局時候需要給View需要統一做處理,或者開發中會有一些資料model向View model轉化例項化的過程中需要用到。

mSheetDialogView = View.inflate(activity, R.layout.biz_exam_plan_layout_sheet_inner, null).apply{
   course_comment_tv_label.paint.isFakeBoldText = true
   course_comment_tv_score.paint.isFakeBoldText = true
   course_comment_tv_cancel.paint.isFakeBoldText = true
   course_comment_tv_confirm.paint.isFakeBoldText = true
   course_comment_seek_bar.max = 10
   course_comment_seek_bar.progress = 0
}
複製程式碼

內聯擴充套件函式之also,返回的是傳入的物件本身。和let差不多。

   val result = "testLet".also {
        println(it.length)
        1000
    }
    println(result)
複製程式碼

repeat函式: 重複執行一段程式碼的次數。例如,我要列印3次Hello world,就如下:

repeat(3) {
        println("Hello world")
    }
    ```
複製程式碼

相關文章