Поиск…


Синтаксис

  • Явные параметры:

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

  • Выведенные параметры:

  • val add: (Int, Int) -> Int = {a, b -> a + b}

  • Один параметр - it сокращенный

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

  • Подпись:

  • () -> ResultType

  • (InputType) -> ResultType

  • (InputType1, InputType2) -> ResultType

замечания

Параметры типа ввода могут быть опущены, когда их можно оставить без внимания, когда они могут быть выведены из контекста. Например, скажем, что у вас есть функция класса, который выполняет функцию:

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

Вы можете использовать эту функцию, передав лямбда, и поскольку параметры уже указаны в сигнатуре функции, нет необходимости повторно объявлять их в выражении лямбда:

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

Это также применяется, когда вы назначаете лямбда переменной:

//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 }

Когда лямбда принимает один параметр, и тип может быть выведен из контекста, вы можете обратиться к параметру с помощью it .

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

Лямбда как параметр для функции фильтрации

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

Лямбда передавалась как переменная

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

Лямбда для сравнения вызова функции

Секундомер общего назначения для определения времени выполнения функции для запуска:

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

Использование:

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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow