代码之家  ›  专栏  ›  技术社区  ›  Asif Mushtaq

Kotlin函数类型代替函数接口lambda

  •  -2
  • Asif Mushtaq  · 技术社区  · 8 年前

    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 接管结果 onResult 因此,我可以将值传递给 result()

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

    接管结果 ? 我知道kotlin中的函数接口和匿名类解决方案。但是我想用lambda实现它,这也将有助于我对lambda的理解。

    2 回复  |  直到 8 年前
        1
  •  1
  •   outis    8 年前

    您可以使用属性来保存处理程序。

    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){
            resultHandler?.invoke(resultCode, resultData)
        }
    }
    
        2
  •  1
  •   Strelok    8 年前

    为什么不这样做呢?在初始化期间提供on-result回调:

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