Intereting Posts
Вызвать getMeasuredWidth () или getWidth () для возврата RecyclerView 0 при привязке данных Не удалось выполнить синхронизацию проекта с градиентом. Основные функции не будут работать должным образом в Android-студии 3.0 Как получить пакет kotlin путем отражения Использование констант kotlin в выражении java switch Пользовательский тип Kotlin Generics с использованием подстановочного знака JavaFX Сброс графического контекста Стереть внутренний статус объекта в тесте Используя Kovenant от Kotlin, я продолжаю использовать повторяющийся код, используя Deferred как использовать DecoratingStringHashMapper с kotlin? Android gradle build неожиданно отключается в ': app: mergeDebugResources' без сообщений об ошибках Переустановите 2 POST XML и получите ответ JSON от API. с Котлином Kotlin: Как работать со списками: Непроверено В ролях: kotlin.collections.List <Kotlin.Any?> To kotlin.colletions.List <Путевая точка> Преобразование файлов определения TypeScript в Kotlin после использования Kotlin, мой проект случится, что java.lang.NoClassDefFoundError Статические аналогичные методы в Android-приложении с kotlin

Kotlin: как передать функцию как параметр другому?

Данная функция foo:

fun foo(m: String, bar: (m: String) -> Unit) { bar(m) } 

Мы можем сделать:

 foo("a message", { println("this is a message: $it") } ) //or foo("a message") { println("this is a message: $it") } 

Теперь, скажем, мы имеем следующую функцию:

 fun buz(m: String) { println("another message: $m") } 

Есть ли способ передать «buz» в качестве параметра «foo»? Что-то вроде:

 foo("a message", buz) 

Solutions Collecting From Web of "Kotlin: как передать функцию как параметр другому?"

Используйте :: для обозначения ссылки функции, а затем:

 fun foo(m: String, bar: (m: String) -> Unit) { bar(m) } // my function to pass into the other fun buz(m: String) { println("another message: $m") } // someone passing buz into foo fun something() { foo("hi", ::buz) } 

Начиная с Kotlin 1.1 теперь вы можете использовать функции, являющиеся членами класса (« Связанные вызовы »), путем префикса оператора ссылки функции экземпляром:

 foo("hi", OtherClass()::buz) foo("hi", thatOtherThing::buz) foo("hi", this::buz) 

О функции-члена в качестве параметра:

  1. Класс Kotlin не поддерживает статическую функцию-член, поэтому функцию-член нельзя вызвать, например: Operator :: add (5, 4)
  2. Поэтому функция-член не может использоваться так же, как функция первого класса.
  3. Полезный подход заключается в том, чтобы обернуть функцию с помощью лямбда. Это не изящно, но, по крайней мере, он работает.

код:

 class Operator { fun add(a: Int, b: Int) = a + b fun inc(a: Int) = a + 1 } fun calc(a: Int, b: Int, opr: (Int, Int) -> Int) = opr(a, b) fun calc(a: Int, opr: (Int) -> Int) = opr(a) fun main(args: Array<String>) { calc(1, 2, { a, b -> Operator().add(a, b) }) calc(1, { Operator().inc(it) }) } 

по-видимому, это пока не поддерживается.

больше информации:

http://devnet.jetbrains.com/message/5485180#5485180

http://youtrack.jetbrains.com/issue/KT-1183

Просто используйте «::» перед именем метода в качестве параметра

 fun main(args: Array<String>) { runAFunc(::runLines) } fun runAFunc(predicate: (Int) -> (Unit)) { val a = "five" if (a == "five") predicate.invoke(5) else predicate.invoke(3) } fun runLines(numbers: Int) { var i = numbers while (i > 0) { println("printed number is $i") i-- } } 

Котлин 1.1

this :: buz (если в том же классе) или Class () :: buz, если разные

Первоначальные функции в настоящее время не поддерживаются в Котлине. Там были дебаты о том, будет ли это хорошей возможностью для добавления. Я лично думаю, что они должны.