使用lambda简化Kotlin函数

时间:2018-05-29 11:28:40

标签: lambda kotlin

我在FooClass class:

上有这个功能
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 个答案:

答案 0 :(得分:6)

你需要使用一些技巧。

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

答案 1 :(得分:1)

感谢@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
            }
    )