使用lambda简化Kotlin函数

Gab*_*eno 3 lambda kotlin

我在FooClass课堂上有这个功能:

fun foo(id: Int, listener: Listener<JsonElement>) {
    enqueue(listener, apiService.getFoo(id))
}
Run Code Online (Sandbox Code Playgroud)

这是界面:

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

    fun onFailure()
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

fun foo {id ->
    // Perform onSuccess
    // Perform onFailure
}
Run Code Online (Sandbox Code Playgroud)

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

非常感谢你的帮助.

Epi*_*rce 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()
    })
}
Run Code Online (Sandbox Code Playgroud)

现在你应该可以打电话了

FooClass().foo(id, 
    success = { result: JsonElement? -> 
        ... 
    }, 
    failure = { 
    }
)
Run Code Online (Sandbox Code Playgroud)