如何在Kotlin中从头开始实现可选的回调?

时间:2019-05-27 06:13:54

标签: android class kotlin callback optional

我有此功能,效果很好。

inline fun <reified T:Any>String.parse() : T {
    return GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create().fromJson<T>(this, T::class.java)
}

fun request (callback: (MyClass)->Unit) {
    val url = URL("someurl").readText()
    val myObject : MyClass = str.parse()
    callback(myObject)
}

net.request {
    it.myFunction()
    println (it.myString)
}

myObject自动填充了MyClass类型的对象,并正确返回到回调。

现在,我想捕获错误,并且让回调函数也可以返回该错误。

fun request (callback: (MyClass?, Exception?)->Unit) {
    try {
        val url = URL("someurl").readText()
        val myObject : MyClass = str.parse()
        callback(myObject, null)
    }
    catch (e: Exception) {
        callback(null, e)
    }
}

net.request { response, error ->
    if (response != null ) { // do something }
    else { // report something }
}

但是这很丑陋,因为无论如何,我将不得不强制回调始终具有两个参数,但是一次只存在一个。所以我在寻找可选的回调方法。我希望能够这样调用方法:

net.request { 
    onSuccess { response -> // do something }
    onError { error -> // report something }
}

或者可能:

net.request
    .onSuccess { response -> // do something }
    .onError { error -> // report something }

如果我不想处理该错误,我只需拨打一个电话:

net.request {
    onSuccess { // do something with 'it' }
}

我在互联网上可以找到的是覆盖现有的回调方法,例如this。这不是我想要的。我想从头开始编写该回调。查看源代码有时也无济于事,因为代码是Java的,而且我也不了解Java。还没有。

我了解Kotlin中的主要库(例如翻新或JavaRx)可能已经实现了类似的功能,但是我只是想知道执行此操作所需的最少代码,因为这是我的学习方法。我只是找不到正确的教程。

1 个答案:

答案 0 :(得分:0)

您可以尝试library。它有助于简洁地建模成功/失败操作。然后,您的回调可以将MyClassResult<MyClass, Exception>这样包装的Result对象作为对象。

要将值传递给回调,请先执行Callback(Result.of(MyClass))才能成功执行操作,如果失败则执行Callback(Result.of(Exception()))

然后您可以使用以下任何功能来使用回调

//if successful
result.success {
}

//if failed
result.failure {
}

//fold is there, if you want to handle both success and failure
result.fold({ value ->
    //do something with value
}, { error ->
    //do something with error
})

希望这会有所帮助:)

编辑:如@ user2340612所指出,Result已添加到Kotlin stdlib中。有关更多详细信息,请参见here