Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin函数类型代替函数接口lambda_Lambda_Kotlin - Fatal编程技术网

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

Kotlin函数类型代替函数接口lambda,lambda,kotlin,Lambda,Kotlin,在kotlin中,我正在努力与java中的函数接口相反。我有以下问题 class ResultReceiverTest(handler : Handler) : ResultReceiver(handler) { fun onResult(result : (resultCode : Int, resultData: Bundle) -> Unit){ // result() how to receive values from onReceiveResult()

在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
    }
}
我有以下情况,首先调用
onreceivesult
,然后我想将
onreceivesult
的参数值传递给
onResult
,这样我就可以将值传递给
result()
,这是由下面的类实现的

class StartService {
    private var resultReceiverTest = ResultReceiverTest(Handler())

    init{
        resultReceiverTest.onResult({a, b -> something()})
    }


    fun something(){}
}

那么我如何将值从
onReceiveResult
传递到
onResult
?我知道kotlin中的函数接口和匿名类解决方案。但是我想使用lambda实现它,这也将有助于我理解lambda。

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

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

为什么不这样做呢?在初始化期间提供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) }

}

我在第二行看到错误
null
。我无法分配null。找到了解决方案。我得在论文中把这类字圈起来<代码>((resultCode:Int,resultData:Bundle)->单位)?如何调用
resultCode
?使用显式
?.invoke()
显示错误。为什么要调用
resultCode
?这是一个参数,您只是不能调用参数。对不起,我刚才说的是
resultHandler
如何调用
resultCode
?使用显式
?.invoke()
会显示错误。错误是什么?上面的代码在Kotlin 1.1.3中编译得很好,这是一个打字错误。我说的是
resultReceiverTest
函数