Kotlin
Basic Lambdas
Zoeken…
Syntaxis
Expliciete parameters:
{parameterName: ParameterType, otherParameterName: OtherParameterType -> anExpression ()}
Afgeleide parameters:
val toevoeging: (Int, Int) -> Int = {a, b -> a + b}
Enkele parameter
it
stenoval square: (Int) -> Int = {it * it}
Handtekening:
() -> ResultType
(InputType) -> ResultType
(InputType1, InputType2) -> ResultType
Opmerkingen
Parameters voor invoertype kunnen worden weggelaten wanneer ze kunnen worden weggelaten wanneer ze uit de context kunnen worden afgeleid. Stel bijvoorbeeld dat u een functie op een klasse heeft die een functie aanneemt:
data class User(val fistName: String, val lastName: String) {
fun username(userNameGenerator: (String, String) -> String) =
userNameGenerator(firstName, secondName)
}
U kunt deze functie gebruiken door een lambda door te geven, en aangezien de parameters al in de functiesignatuur zijn opgegeven, is het niet nodig om ze opnieuw in de lambda-expressie te declareren:
val user = User("foo", "bar")
println(user.userName { firstName, secondName ->
"${firstName.toUppercase}"_"${secondName.toUppercase}"
}) // prints FOO_BAR
Dit is ook van toepassing wanneer u een lambda toewijst aan een variabele:
//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 }
Wanneer de lambda neemt één parameter, en het type kan worden afgeleid uit de context, kunt u verwijzen naar de parameter door it
.
listOf(1,2,3).map { it * 2 } // [2,4,6]
Lambda als parameter voor filterfunctie
val allowedUsers = users.filter { it.age > MINIMUM_AGE }
Lambda is geslaagd als variabele
val isOfAllowedAge = { user: User -> user.age > MINIMUM_AGE }
val allowedUsers = users.filter(isOfAllowedAge)
Lambda voor het benchmarken van een functieaanroep
Stopwatch voor algemene doeleinden om te bepalen hoe lang het duurt voordat een functie wordt uitgevoerd:
object Benchmark {
fun realtime(body: () -> Unit): Duration {
val start = Instant.now()
try {
body()
} finally {
val end = Instant.now()
return Duration.between(start, end)
}
}
}
Gebruik:
val time = Benchmark.realtime({
// some long-running code goes here ...
})
println("Executed the code in $time")