Buscar..


Sintaxis

  • Parámetros explícitos:

  • {parametersName: ParameterType, otherParameterName: OtherParameterType -> anExpression ()}

  • Parámetros inferidos:

  • adición val: (Int, Int) -> Int = {a, b -> a + b}

  • Un solo parámetro it taquigrafía

  • cuadrado de val: (Int) -> Int = {it * it}

  • Firma:

  • () -> ResultType

  • (InputType) -> ResultType

  • (InputType1, InputType2) -> ResultType

Observaciones

Los parámetros de tipo de entrada se pueden omitir cuando se pueden omitir cuando se pueden inferir del contexto. Por ejemplo, digamos que tiene una función en una clase que toma una función:

data class User(val fistName: String, val lastName: String) {
    fun username(userNameGenerator: (String, String) -> String) =
        userNameGenerator(firstName, secondName)
}

Puede utilizar esta función pasando un lambda, y como los parámetros ya están especificados en la firma de la función, no es necesario volver a declararlos en la expresión lambda:

val user = User("foo", "bar")
println(user.userName { firstName, secondName ->
     "${firstName.toUppercase}"_"${secondName.toUppercase}"
 }) // prints FOO_BAR

Esto también se aplica cuando está asignando un lambda a una 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 }

Cuando la lambda toma un parámetro, y el tipo se puede inferir del contexto, puede referirse al parámetro por it .

listOf(1,2,3).map { it * 2 } // [2,4,6]

Lambda como parámetro para filtrar la función.

val allowedUsers = users.filter { it.age > MINIMUM_AGE }

Lambda pasó como una variable

val isOfAllowedAge = { user: User -> user.age > MINIMUM_AGE }
val allowedUsers = users.filter(isOfAllowedAge)

Lambda para benchmarking una función llamada

Cronómetro de propósito general para medir el tiempo que tarda una función en ejecutarse:

object Benchmark {
    fun realtime(body: () -> Unit): Duration {
        val start = Instant.now()
        try {
            body()
        } finally {
            val end = Instant.now()
            return Duration.between(start, end)
        }
    }
}

Uso:

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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow