Тип функции Kotlin вместо функционального интерфейса лямбда

Я борюсь в kotlin, чтобы получить противоположность функционального интерфейса в java. У меня есть следующая проблема.

class ResultReceiverTest(handler : Handler) : ResultReceiver(handler) { fun onResult(result : (resultCode : Int, resultData: Bundle) -> Unit){ // result() how to receive values from onReceiveResult() method? } override fun onReceiveResult(resultCode: Int, resultData: Bundle){ // how to call onResult from here? // I want to pass resultCode, resultData parameter to onResult function } } 

У меня есть следующая ситуация: в первую очередь onReceiveResult тогда я хочу передать значение onReceiveResult onReceiveResult в onResult чтобы я мог передать значение result() которое реализуется следующим классом.

 class StartService { private var resultReceiverTest = ResultReceiverTest(Handler()) init{ resultReceiverTest.onResult({a, b -> something()}) } fun something(){} } 

Итак, как я могу доставить значение от onReceiveResult до onResult ? Я знаю функциональный интерфейс и анонимное решение класса в kotlin. Но я хочу достичь этого, используя лямбду, которая будет полезна для моего понимания лямбда.

Вы можете использовать свойство для хранения обработчика.

 class ResultReceiverTest(handler : Handler) : ResultReceiver(handler) { private var resultHandler: ((resultCode : Int, resultData: Bundle) -> Unit)? = null fun onResult(result : (resultCode : Int, resultData: Bundle) -> Unit){ resultHandler = result } override fun onReceiveResult(resultCode: Int, resultData: Bundle){ if (resultHandler != null) resultHandler(resultCode, resultData) } } 

Почему бы не сделать что-то подобное? Обеспечить обратный вызов результата при инициализации:

 class ResultReceiverTest(handler: Handler, private val onResult: (Int, Bundle) -> Unit) : ResultReceiver(handler) { override fun onReceiveResult(resultCode: Int, resultData: Bundle) { onResult(resultCode, resultData) } } // Do it with a function reference class StartService { private var resultReceiverTest = ResultReceiverTest(Handler(), this::doSomethingWithResult) fun doSomethingWithResult(resultCode: Int, resultData: Bundle) { println(resultCode) } } // OR DO IT INLINE class StartService { private var resultReceiverTest = ResultReceiverTest(Handler()) { resultCode, resultData -> println(resultCode) } } 
Intereting Posts
Почему выражения лямбда ведут себя по-разному для классов Kotlin и Java? когда использовать lateinit, init block и companion object. Котлин Модернизация с помощью качеств Котлина, которые включают реализованные методы Android: кнопка на фрагменте Текст мигает в Android, с наиболее кратким Kotlin java.lang.ClassNotFoundException: Не нашел класс «com.my.app.example.Main» по пути: DexPathList Фильтр для общего типа без отражения или литья Kotlin: Как изменить значение в паре? Получение информации KProperty изнутри делегированной собственности вне функций getValue () и setValue () Как поместить диалог в нижнюю часть MapOnClickListener, похоже, не работает Конвертировать бесконечно бегущий Runnable из java в kotlin Как объявить параметр как функцию без возвращаемого значения? Возврат к фрагменту с обратной связью Как я могу заставить конечную точку остального читать файл cookie и использовать это значение в okhttp Interceptor?