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 raccourci

  • val 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")


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow