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