Упростите функцию Котлина с помощью лямбды - PullRequest
0 голосов
/ 29 мая 2018

У меня есть эта функция на 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() {}
})

Я хочу сделать лямбду, чтобы упростить, когда я звоню.Примерно так:

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

Я знаю, что это просто, но я в беспорядке ...: - (

Большое спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Благодаря @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
            }
    )
0 голосов
/ 29 мая 2018

Для этого вам понадобятся некоторые хитрости.

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 = { 
    }
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...