Kotlin
Lambdas de base
Recherche…
Syntaxe
Paramètres explicites:
{parameterName: ParameterType, otherParameterName: OtherParameterType -> anExpression ()}
Paramètres inférés:
val addition: (Int, Int) -> Int = {a, b -> a + b}
Paramètre unique
it
raccourcival square: (Int) -> Int = {it * it}
Signature:
() -> ResultType
(InputType) -> ResultType
(InputType1, InputType2) -> ResultType
Remarques
Les paramètres de type d'entrée peuvent être omis lorsqu'ils peuvent être omis lorsqu'ils peuvent être déduits du contexte. Par exemple, disons que vous avez une fonction sur une classe qui a une fonction:
data class User(val fistName: String, val lastName: String) {
fun username(userNameGenerator: (String, String) -> String) =
userNameGenerator(firstName, secondName)
}
Vous pouvez utiliser cette fonction en passant un lambda, et comme les paramètres sont déjà spécifiés dans la signature de la fonction, il n'est pas nécessaire de les déclarer de nouveau dans l'expression lambda:
val user = User("foo", "bar")
println(user.userName { firstName, secondName ->
"${firstName.toUppercase}"_"${secondName.toUppercase}"
}) // prints FOO_BAR
Cela s'applique également lorsque vous affectez un lambda à une 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 }
Lorsque le lambda prend un paramètre et que le type peut être déduit du contexte, vous pouvez vous référer au paramètre par it
.
listOf(1,2,3).map { it * 2 } // [2,4,6]
Lambda comme paramètre pour filtrer la fonction
val allowedUsers = users.filter { it.age > MINIMUM_AGE }
Lambda passé en tant que variable
val isOfAllowedAge = { user: User -> user.age > MINIMUM_AGE }
val allowedUsers = users.filter(isOfAllowedAge)
Lambda pour évaluer un appel de fonction
Chronomètre polyvalent pour déterminer la durée d'exécution d'une fonction:
object Benchmark {
fun realtime(body: () -> Unit): Duration {
val start = Instant.now()
try {
body()
} finally {
val end = Instant.now()
return Duration.between(start, end)
}
}
}
Usage:
val time = Benchmark.realtime({
// some long-running code goes here ...
})
println("Executed the code in $time")