首页 文章

使用lambda简化Kotlin函数

提问于
浏览
3

我在 FooClass 类上有这个函数:

fun foo(id: Int, listener: Listener<JsonElement>) {
    enqueue(listener, apiService.getFoo(id))
}

这是界面:

interface Listener<T> {
    fun onSuccess(result: T?)

    fun onFailure()
}

当我打电话给我时,我这样做:

FooClass().foo(id, object : FooClass.Listener<JsonElement> {
    override fun onSuccess(result: JsonElement?) {}
    override fun onFailure() {}
})

我想在拨打电话时简化一个lambda . 像这样的东西:

fun foo {id ->
    // Perform onSuccess
    // Perform onFailure
}

我知道这是基本的,但我很乱...... :-(

非常感谢你的帮助 .

2 回答

  • 1

    你需要使用一些技巧 .

    typealias SuccessCallback<T> = (T?) -> Unit
    typealias FailureCallback = () -> Unit
    
    inline fun FooClass.foo(id: Int, crossinline success: SuccessCallback<JsonElement?>, crossinline failure: FailureCallback) {
        foo(id, object: FooClass.Listener<JsonElement> {
            override fun onSuccess(result: JsonElement?) = success(result)
            override fun onFailure() = failure()
        })
    }
    

    现在你应该可以打电话了

    FooClass().foo(id, 
        success = { result: JsonElement? -> 
            ... 
        }, 
        failure = { 
        }
    )
    
  • 6

    感谢@EpicPandaForce,我找到了一个解决方案 . 就是这个:

    fun foo(id: Int, success: (JsonElement?) -> Unit, error: () -> Unit) {
        enqueue(apiService.getFoo(id), object : Listener<JsonElement> {
            override fun onSuccess(result: JsonElement?) = success(result)
    
            override fun onFailure() = error()
        })
    }
    

    我重构了 enqueue 函数上的参数顺序,以便更具可读性 .

    调用函数就像这样简单:

    FooClass().foo(id,
                success = { result ->
                    // Handle success result
                },
                error = {
                    // Handle error
                }
        )
    

相关问题