【19】Kotlin语法进阶——Kotlin高阶函数的应用

提示:此文章仅作为本人记录日常学习使用,若有存在错误或者不严谨得地方欢迎指正。

文章目录

一、高阶函数的应用

高阶函数非常适合用来简化各种API的调用,本章我们将运用高阶函数的知识来简化SharedPreferences这个API。

1.1 SharedPreferences的简化

在前面的文章中,我们学习并使用了SharedPreferences来实现数据持久化的功能。在得到了SharePreferences对象后,如果想将数据存储到SharePreferences文件中,需要以下几个步骤:

  1. 调用SharePreferences对象的edit()方法获取一个SharePreferences.Editor对象
  2. 向SharePreferences.Editor对象中添加数据(putBoolean()、putString等)
  3. 通过apply( )方法提交所添加的数据,完成数据的存储

对应的代码示例如下:

kotlin 复制代码
//通过getSharedPreferences().edit()方法获得Editor对象
val myEditor = getSharedPreferences("shared_prefs_data", MODE_PRIVATE).edit()
//以键值对的方式向Editor对象中添加数据
myEditor.putString("name", "CodingBear")
myEditor.putInt("age", 18)
myEditor.putBoolean("single", true)
//将数据存储到SharePreferences文件中
myEditor.apply()

接下来,我们尝试使用Kotlin高阶函数来简化SharedPreferences的用法。新建一个SharedPreferences.kt文件,然后在里面加入以下代码:

kotlin 复制代码
//扩展函数open期望接收一个lambda函数作为参数,并且这个lambda函数将在扩展函数内部被调用
fun SharedPreferences.open(block:SharePreferences.Editor.()->Unit){
    val editor = edit()
    // 在lambda函数内部对editor进行操作
    editor.block()
    editor.apply()
}

可以看到,我们首先定义了一个SharedPreferences的扩展函数open() ,并让它接收一个函数类型的参数 ,因此open()就是一个高阶函数 。由于扩展函数open()拥有SharedPreferences的上下文,因此这里可以直接调用edit()方法来获取SharePreferences.Editor对象 。由于open()接收的是一个SharedPreferences.Editor的函数类型参数 ,因此这里需要调用editor.block()对函数类型参数进行调用,我们就可以在函数类型参数的具体实现中添加数据了。最后调用apply( )方法提交所添加的数据,完成数据的存储。

在定义好open()后,我们在项目中使用SharedPreferences存储数据就会更加的简单:

kotlin 复制代码
getSharedPreferences("shared_prefs_data", MODE_PRIVATE).open{
	putString("name", "CodingBear")
	putInt("age", 18)
	putBoolean("single", true)
}

可以看到,我们直接在SharedPreferences对象上调用open(),然后在Lambda表达式中完成数据的添加操作即可。Lambda表达式拥有SharePreferences.Editor的上下文,所以我们直接调用putXXX()方法添加数据即可。最后我们也不需要调用apply()方法来提交数据,因为open()函数会自动完成提交操作。
其实Google的KotlinX扩展库中已经包含了上述SharePreferences的简化用法 ,这个扩展库会在Android Studio创建项目的时候会被自动导入到build.gradle.kts(:app)的dependencies中:

因此我们可以直接在项目中使用如下写法向SharePreferences中存储数据:

kotlin 复制代码
                          注意:使用的是Kotlin自带扩展库中的edit{}不是SharePreferences类的edit()
getSharedPreferences("data", Context.MODE_PRIVATE).edit {
    putString("name", "CodingBear")
    putInt("age", 18)
    putBoolean("single", true)
}

可以看到,其实就是将open()换成了edit{},其余的写法都是一模一样的。你在正式项目中完全可以使用Kotlin扩展库自带的edit{},但是掌握高阶函数优化API这种方式对你后续的编程会有很大的帮助。

相关推荐
❆VE❆7 分钟前
WebSocket与SSE深度对比:技术差异、场景选型及一些疑惑
前端·javascript·网络·websocket·网络协议·sse
rgeshfgreh13 分钟前
Java高性能开发:Redis7持久化实战
前端·bootstrap·mybatis
李剑一36 分钟前
uni-app使用html5+创建webview,可以控制窗口大小、显隐、与uni通信
前端·trae
Hooray1 小时前
2026年,站在职业生涯十字路口的我该何去何从?
前端·后端
小二·1 小时前
Python Web 开发进阶实战:安全加固实战 —— 基于 OWASP Top 10 的全栈防御体系
前端·python·安全
over6971 小时前
🌟 JavaScript 数组终极指南:从零基础到工程级实战
前端·javascript·前端框架
社恐的下水道蟑螂1 小时前
深入掌握 AI 全栈项目中的路由功能:从基础到进阶的全面解析
前端·react.js·全栈
米诺zuo1 小时前
Angular 18 核心特性速查表
前端
源猿人1 小时前
前端批量请求的并发控制与工程化实践
javascript
hey_ner1 小时前
进度条图表简单化
前端·css·css3