基本的 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]