Kotlin
Grundläggande Lambdas
Sök…
Syntax
Explicit parametrar:
{parameterName: ParameterType, otherParameterName: OtherParameterType -> anExpression ()}
Slutna parametrar:
valtillägg: (Int, Int) -> Int = {a, b -> a + b}
Enkel parameter
it
kortaval square: (Int) -> Int = {it * it}
Signatur:
() -> ResultType
(InputType) -> ResultType
(InputType1, InputType2) -> ResultType
Anmärkningar
Parametrar för ingångstyp kan utelämnas när de kan lämnas ut när de kan dras ut från sammanhanget. Till exempel säger att du har en funktion i en klass som tar en funktion:
data class User(val fistName: String, val lastName: String) {
fun username(userNameGenerator: (String, String) -> String) =
userNameGenerator(firstName, secondName)
}
Du kan använda den här funktionen genom att lämna en lambda, och eftersom parametrarna redan anges i funktionssignaturen finns det inget behov av att deklarera dem igen i lambda-uttrycket:
val user = User("foo", "bar")
println(user.userName { firstName, secondName ->
"${firstName.toUppercase}"_"${secondName.toUppercase}"
}) // prints FOO_BAR
Detta gäller också när du tilldelar en lambda till en variabel:
//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 }
När lambda tar en parameter och typen kan dras ut ur sammanhanget kan du hänvisa till parametern med it
.
listOf(1,2,3).map { it * 2 } // [2,4,6]
Lambda som parameter för filterfunktion
val allowedUsers = users.filter { it.age > MINIMUM_AGE }
Lambda passerade som en variabel
val isOfAllowedAge = { user: User -> user.age > MINIMUM_AGE }
val allowedUsers = users.filter(isOfAllowedAge)
Lambda för benchmarking av ett funktionssamtal
Allmän stoppur för tidpunkten för hur lång tid en funktion tar att köra:
object Benchmark {
fun realtime(body: () -> Unit): Duration {
val start = Instant.now()
try {
body()
} finally {
val end = Instant.now()
return Duration.between(start, end)
}
}
}
Användande:
val time = Benchmark.realtime({
// some long-running code goes here ...
})
println("Executed the code in $time")