Kotlin实现多函数接口的简化调用
发布时间 - 2026-01-11 01:59:37 点击率:次对于一个声明了多个方法的接口,我们使用的时候有时仅仅关注于几个关键方法,并不需要实现所有的。可是由于接口调用的语法限制,使得我们不得不在代码中也显示声明实现了那些我们不关心的方法。在Java中也有简化接口调用的方式,比如安卓中ViewPager监听页面切换时的接口PageChangeListener,官方提供了简单类: ViewPager.SimpleOnPageChangeListener来简化调用。

对于Kotlin来说,可以类似使用java的方式,来实现多函数接口的简化调用,只是要用到object关键字且代码仍会较多。这里,由于Kotlin的语法更为灵活,去实现这种调用应该有其特色的方式,使得代码更少,且更加具有张力。
来个小例子,先简单介绍类似java实现多函数接口的简化调用,一是展示什么是简化接口调用,二是做对比。这里得例子都用kotlin写的。
1.声明接口CallBack 和调用类Worker
interface CallBack {
fun onSuccess(str: String)
fun onFailure(code: Int)
}
class Worker {
var callback: CallBack? = null
fun done(str: String) {
callback?.onSuccess(str)
}
fun fail(code: Int) {
callback?.onFailure(code)
}
fun setCallBack(lis: CallBack) {
callback = lis;
}
}
2.直接调用接口,使用了object关键字 ,此时假设不关心success方法,但必须显示声明。
Worker().apply {
setCallBack(object : CallBack {
override fun onSuccess(str: String) {
}
override fun onFailure(code: Int) {
toast("$code")
}
})
}.fail(110)
//结果:吐司:110
3.Java风格简化调用,声明简化类SimCallBack
public class SimCallBack implements CallBack{
@Override
public void onSuccess(@NotNull String str) {
}
@Override
public void onFailure(int code) {
}
}
4.Java风格简化调用的展示,不关心的onSuccess不用再显示声明
Worker().apply {
setCallBack(object : SimCallBack() {
override fun onFailure(code: Int) {
super.onFailure(code)
toast("$code")
}
})
}.fail(110)
上述带着浓浓java味道的调用,不仅代码风格比较混杂,而且代码显得冗余。重点来了,Kotlin怎么去克服上面两点呢。看例子。
1.还是CallBack接口,不过其简化类需要用Kotlin风格来做:
class SimpleCallBack : CallBack{
private var _OnSucess: ((str: String) -> Unit)? = null
fun success(listener: (str: String) -> Unit) {
_OnSucess = listener
}
override fun onSuccess(str: String) {
_OnSucess?.invoke(str)
}
private var _OnFailure: ((code: Int) -> Unit)? = null
override fun onFailure(code: Int) {
_OnFailure?.invoke(code)
}
fun fail(listener: (code: Int) -> Unit) {
_OnFailure = listener
}
}
声明了两个函数类型变量 _OnSucess和 _OnFailure,作用就是内部将原来的大接口CallBack分解。然后声明了对应的方法success和fail,目的是给变量小接口赋值。接着就是原接口方法的处理,比如原接口方法onSuccess(str: String)的操作 _OnSucess?.invoke(str),目的是实现接口回调结果的转移。做这些,目的就是为以后的简化调用做准备。
2.调用类Worker 也是要进行处理一下的,代码基本同原来的那些,只是增加了以下方法。注意,若不是为了兼容java方式,原setCallBack可以不再声明,直接赋值就好,由此,新增方法可以看做是原setCallBack方法的替换。
fun setCallBacker(listener: SimpleCallBack.() -> Unit) {
var ca = SimpleCallBack()
ca.listener()
setCallBack(ca)
}
注意名称。本方法接受一个函数参数,方法的作用是内部生成一个简化接口对象SimpleCallBack,然后再让调用类注册到接口。然后执行传进来的函数参数,为什么要这样呢,是为了使用kotlin语法中灵活的闭包{}。另外,配上强大的函数扩展语法,不改变原有类,增加个这种方法还是比较容易的。
3.最后看看调用方式吧:
Worker().apply {
setCallBacker {
success { toast(it) }
fail { }//若不需要,可以不显示声明
}
}.done("完成")
//结果:吐司:完成
最后结果可以看出,当调用多函数接口CallBack时,并不需要再声明接口,而是直接在闭包里声明想要使用的方法,然后在对应的方法闭包里执行操作即可。风格完全是kotlin,且使用特别简便。
分享结束,希望对读者有所帮助。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Kotlin多函数接口调用
# Kotlin函数接口调用
# Kotlin接口调用
# Kotlin基础教程之dataclass
# objectclass
# use函数
# 类扩展
# socket
# Kotlin语法学习-变量定义、函数扩展、Parcelable序列化等简单总结
# Kotlin中let()with()run()apply()also()函数的使用方法与区别
# Kotlin中标准函数run、with、let、also与apply的使用和区别详解
# Kotlin 内联函数详解及实例
# 玩转Kotlin 彻底弄懂Lambda和高阶函数
# 详解Kotlin 高阶函数 与 Lambda 表达式
# Kotlin基础教程之Run
# 标签Label
# 函数Function-Type
# Kotlin基础教程之函数定义与变量声明
# Kotlin函数默认值的完全讲解
# 不关心
# 若不
# 包里
# 是为了
# 几个
# 来了
# 也有
# 带着
# 多个
# 目的是
# 一是
# 就好
# 要用
# 较多
# 可以看出
# 中也
# 不需
# 来做
# 来个
# 都用
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
济南网站建设制作公司,室内设计网站一般都有哪些功能?
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
Laravel如何处理异常和错误?(Handler示例)
Laravel怎么调用外部API_Laravel Http Client客户端使用
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
iOS正则表达式验证手机号、邮箱、身份证号等
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
如何做网站制作流程,*游戏网站怎么搭建?
如何快速上传建站程序避免常见错误?
EditPlus中的正则表达式实战(6)
Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
如何在云主机上快速搭建多站点网站?
企业网站制作这些问题要关注
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
大同网页,大同瑞慈医院官网?
javascript中对象的定义、使用以及对象和原型链操作小结
简单实现Android文件上传
如何确保西部建站助手FTP传输的安全性?
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
简单实现jsp分页
桂林网站制作公司有哪些,桂林马拉松怎么报名?
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
如何在IIS中新建站点并解决端口绑定冲突?
bing浏览器学术搜索入口_bing学术文献检索地址
韩国服务器如何优化跨境访问实现高效连接?
浅析上传头像示例及其注意事项
Laravel怎么连接多个数据库_Laravel多数据库连接配置
昵图网官网入口 昵图网素材平台官方入口
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
如何快速查询网址的建站时间与历史轨迹?
如何在阿里云购买域名并搭建网站?
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
如何快速搭建高效简练网站?
如何在Ubuntu系统下快速搭建WordPress个人网站?
html如何与html链接_实现多个HTML页面互相链接【互相】
深圳网站制作的公司有哪些,dido官方网站?
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
Android okhttputils现在进度显示实例代码
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明
原生JS实现图片轮播切换效果
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
Python文本处理实践_日志清洗解析【指导】

