Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Simplify Kotlin function with a lambda

Tags:

lambda

kotlin

I have this function on FooClass class:

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

This is the interface:

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

    fun onFailure()
}

When I call it, I do this:

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

I want to make a lambda to simplify when I make the call. Something like this:

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

I know this is basic, but I'm a mess... :-(

Thank you so much for the help.

like image 313
Gabi Moreno Avatar asked Feb 24 '26 07:02

Gabi Moreno


1 Answers

You'll need to use some tricks for that.

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()
    })
}

Now you should be able to call

FooClass().foo(id, 
    success = { result: JsonElement? -> 
        ... 
    }, 
    failure = { 
    }
)
like image 82
EpicPandaForce Avatar answered Feb 27 '26 01:02

EpicPandaForce