Kotlin使用高阶函数实现多方法回调

最近项目中开始使用kotlin,遇到的一个问题就是从多方法回调的问题
常规的java回调如下:

public interface OnCallBack<T> {
    void onSuccess(T models);
    void onFailed(String message);
}

public abstract class OnRespCallBack<T> implements OnCallBack<T> {
    
    @Override
    public void onFailed(String message) {
        //请求失败
    }
}

public void getData(OnRespCallBack<String> callBack) {
    //进行网络请求或者其他耗时操作
    ...
        callBack.onSuccess(response);
    
    //请求失败时的回调
    ...
        callBack.onFailed(message);
}

public void setData() {
    getData(new OnRespCallBack<String>() {
        @Override
        public void onSuccess(String result) {
            //do success
        }

        @Override
        public void onFailed(String message) {
            super.onFailed(message);
            //do fail
        }    
    }); 
}

使用kotlin的话,可以使用匿名内部类来实现,回调方法调用如下:

pubcli void setData() {
    getData(object : OnRespCallBack<String>() {
        override fun onSuccess(models: String) {
            //do success
        }

        override fun onFailed(message: String) {
            super.onFailed(message)
            //do fail
        }
    })
}

但是如此使用,很不方便,也体现不出来kotlin简洁的优势,这时候就可以考虑使用kotlin的高级函数了。
对于上面的多方法回调,有如下两种修改方式:
方式一:在java基础上修改

class OnCallbackImpl<T>(private val onSuccessF: (T) -> Unit, private val onErrorF: ((String) -> Unit)? = null): OnCallback<T> {
    override fun onSuccess(response: T) {
        onSuccessF(response)
    }


    override fun onFailed(message: String) {
        onErrorF?.let { it(message)}
    }
}

fun getData(callBack:OnRespCallBack<String>) {
    //进行网络请求或者其他耗时操作
    ...
        callBack.onSuccess(response)
    
    //请求失败时的回调
    ...
        callBack.onFailed(message)
}

pubcli void setData() {
    getData(OnCallbackImpl(onSuccessF = {
            //do success
        }, onErrorF = {
            //do error
        })
    )
}

方式二:用更kotlin的方式

class OnCallbackImpl<T>: OnCallback<T> {
    private lateinit var onSuccessF: (T) -> Unit
    private lateinit var onErrorF: (String) -> Unit

    fun onSuccess(listener:(T)->Unit) {
        this.onSuccessF = listener
    }

    override fun onSuccess(response: T) {
        this.onSuccessF(response)
    }


    fun onFailed(listener: (String) -> Unit) {
        this.onErrorF = listener
    }

    override fun onFailed(message: String) {
        this.onErrorF(message)
    }
}

fun getData(callback: OnCallbackImpl<String>.() -> Unit) {
    val back = OnCallbackImpl<String>()
    back.callback()

    //进行网络请求或者其他耗时操作
    ...
         back.onSuccess(response)
    
    //请求失败时的回调
    ...
         back.onFailed(message)
}

pubcli void setData() {
    getData{
        onSuccess {
            //do success
        }
        onFailed {
            //do error
        }
    }
}

参考文章:
Kotlin多方法回调简化(Lambda表达式,recyclerView回调)
kotlin 多接口回调的实现方式(一)
kotlin 多接口回调的实现方式(二)
Kotlin 使用高阶函数实现回调

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Kotlin中,高阶函数可以用于实现回调。所谓高阶函数,就是可以接受一个或多个函数作为参数,或者返回一个函数的函数。通过使用高阶函数,我们可以简化回调实现方式。 具体来说,我们可以将一个函数作为参数传递给另一个函数,然后在需要的时候调用传递进来的函数。这样可以让我们的代码更加简洁、灵活,并且减少了冗余的代码。 在使用Kotlin高阶函数实现回调时,可以使用Lambda表达式来定义匿名函数,从而更加简化代码。Lambda表达式可以通过大括号 {} 来定义,可以在其中编写函数的实现逻辑。 另外,为了方便在Java中调用Kotlin高阶函数Kotlin提供了一系列Function接口类,最多支持22个参数。这些接口类可以用于定义函数类型,以便在Java中使用高阶函数时进行类型匹配。 总之,通过使用Kotlin高阶函数,我们可以简化回调实现方式,使代码更加简洁、易读和灵活。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Kotlin 使用高阶函数实现回调](https://blog.csdn.net/u011494285/article/details/80546335)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Kotlin使用高阶函数实现方法回调](https://blog.csdn.net/Heijinbaitu/article/details/100742964)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值