基本的 Lambdas

當可以從上下文推斷出輸入型別引數時,可以省略輸入型別引數。例如,假設你在一個帶有函式的類上有一個函式:

data class User(val fistName: String, val lastName: String) {
    fun username(userNameGenerator: (String, String) -> String) =
        userNameGenerator(firstName, secondName)
}

你可以通過傳遞 lambda 來使用此函式,並且由於引數已在函式簽名中指定,因此無需在 lambda 表示式中重新宣告它們:

val user = User("foo", "bar")
println(user.userName { firstName, secondName ->
     "${firstName.toUppercase}"_"${secondName.toUppercase}"
 }) // prints FOO_BAR

當你將 lambda 分配給變數時,這也適用:

//valid:
val addition: (Int, Int) = { a, b -> a + b }
//valid:
val addition = { a: Int, b: Int -> a + b }
//error (type inference failure):
val addition = { a, b -> a + b }

當 lambda 採用一個引數,並且可以從上下文推斷出型別時,可以通過 it 引用引數。

listOf(1,2,3).map { it * 2 } // [2,4,6]