Kotlin
Basic Lambdas
Szukaj…
Składnia
Jawne parametry:
{parameterName: ParameterType, otherParameterName: OtherParameterType -> anExpression ()}
Wnioskowane parametry:
dodawanie wartości: (Int, Int) -> Int = {a, b -> a + b}
Pojedynczy parametr
it
skrótval square: (Int) -> Int = {it * it}
Podpis:
() -> ResultType
(InputType) -> ResultType
(InputType1, InputType2) -> ResultType
Uwagi
Parametry typu wejściowego można pominąć, gdy można je pominąć, gdy można je wywnioskować z kontekstu. Załóżmy na przykład, że masz funkcję w klasie, która przyjmuje funkcję:
data class User(val fistName: String, val lastName: String) {
fun username(userNameGenerator: (String, String) -> String) =
userNameGenerator(firstName, secondName)
}
Możesz użyć tej funkcji, przekazując lambda, a ponieważ parametry są już określone w podpisie funkcji, nie ma potrzeby ponownego deklarowania ich w wyrażeniu lambda:
val user = User("foo", "bar")
println(user.userName { firstName, secondName ->
"${firstName.toUppercase}"_"${secondName.toUppercase}"
}) // prints FOO_BAR
Dotyczy to również przypisywania lambda do zmiennej:
//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 }
Gdy lambda przyjmuje jeden parametr, a typ można wywnioskować z kontekstu, możesz odwołać się do parametru przez it
.
listOf(1,2,3).map { it * 2 } // [2,4,6]
Lambda jako parametr do filtrowania funkcji
val allowedUsers = users.filter { it.age > MINIMUM_AGE }
Lambda przeszła jako zmienna
val isOfAllowedAge = { user: User -> user.age > MINIMUM_AGE }
val allowedUsers = users.filter(isOfAllowedAge)
Lambda do testowania wywołania funkcji
Stoper ogólnego zastosowania do pomiaru czasu potrzebnego do uruchomienia funkcji:
object Benchmark {
fun realtime(body: () -> Unit): Duration {
val start = Instant.now()
try {
body()
} finally {
val end = Instant.now()
return Duration.between(start, end)
}
}
}
Stosowanie:
val time = Benchmark.realtime({
// some long-running code goes here ...
})
println("Executed the code in $time")