Kotlin
Lambdas basicas
Buscar..
Sintaxis
Parámetros explícitos:
{parametersName: ParameterType, otherParameterName: OtherParameterType -> anExpression ()}
Parámetros inferidos:
adición val: (Int, Int) -> Int = {a, b -> a + b}
Un solo parámetro
it
taquigrafíacuadrado de val: (Int) -> Int = {it * it}
Firma:
() -> ResultType
(InputType) -> ResultType
(InputType1, InputType2) -> ResultType
Observaciones
Los parámetros de tipo de entrada se pueden omitir cuando se pueden omitir cuando se pueden inferir del contexto. Por ejemplo, digamos que tiene una función en una clase que toma una función:
data class User(val fistName: String, val lastName: String) {
fun username(userNameGenerator: (String, String) -> String) =
userNameGenerator(firstName, secondName)
}
Puede utilizar esta función pasando un lambda, y como los parámetros ya están especificados en la firma de la función, no es necesario volver a declararlos en la expresión lambda:
val user = User("foo", "bar")
println(user.userName { firstName, secondName ->
"${firstName.toUppercase}"_"${secondName.toUppercase}"
}) // prints FOO_BAR
Esto también se aplica cuando está asignando un lambda a una variable:
//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 }
Cuando la lambda toma un parámetro, y el tipo se puede inferir del contexto, puede referirse al parámetro por it
.
listOf(1,2,3).map { it * 2 } // [2,4,6]
Lambda como parámetro para filtrar la función.
val allowedUsers = users.filter { it.age > MINIMUM_AGE }
Lambda pasó como una variable
val isOfAllowedAge = { user: User -> user.age > MINIMUM_AGE }
val allowedUsers = users.filter(isOfAllowedAge)
Lambda para benchmarking una función llamada
Cronómetro de propósito general para medir el tiempo que tarda una función en ejecutarse:
object Benchmark {
fun realtime(body: () -> Unit): Duration {
val start = Instant.now()
try {
body()
} finally {
val end = Instant.now()
return Duration.between(start, end)
}
}
}
Uso:
val time = Benchmark.realtime({
// some long-running code goes here ...
})
println("Executed the code in $time")