Android第一行代码——快速入门 Kotlin 编程(7.6 Kotlin课堂:高阶函数的应用)

目录

7.6        Kotlin课堂:高阶函数的应用

7.6.1        简化 SharedPreferences 的用法


7.6        Kotlin课堂:高阶函数的应用

        在上一章的Kotlin 课堂中,我们学习了高阶函数应该如何使用,而本章的Kotlin 课堂里,我们将会学习高阶函数具体可以用在哪里。这节课的内容会相对简单一些,前提是你已经将上一节课 的内容都牢牢掌握了。

        高阶函数非常适用于简化各种API的调用,一些API的原有用法在使用高阶函数简化之后,不管 是在易用性还是可读性方面,都可能会有很大的提升。

        为了进行举例说明,我们在本节Kotlin 课堂里会使用高阶函数简化 SharedPreferences ContentValues 这两种API的用法,让它们的使用变得更加简单。

7.6.1        简化 SharedPreferences 的用法

        首先来看 SharedPreferences,在开始对它进行简化之前,我们先回顾一下 SharedPreferences 原来的用法。向 SharedPreferences 中存储数据的过程大致可以分为以下 3 步:

        (1) 调用 SharedPreferences edit() 方法获取 SharedPreferences.Editor 对象;

        (2) 向 SharedPreferences.Editor 对象中添加数据;

        (3) 调用 apply() 方法将添加的数据提交,完成数据存储操作。

        对应的代码示例如下:

val editor = getSharedPreferences("data", Context.MODE_PRIVATE).edit()
editor.putString("name", "Tom") 
editor.putInt("age", 28) 
editor.putBoolean("married", false) 
editor.apply() 

        当然,这段代码其实本身已经足够简单了,但是这种写法更多还是在用 Java 的编程思维来编写代码,而在 Kotlin 当中我们明显可以做到更好。

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

fun SharedPreferences.open(block: SharedPreferences.Editor.() -> Unit) {
    val editor = edit()
    editor.block()
    editor.apply()
}

        这段代码虽然不长,但是涵盖了高阶函数的各种精华,下面我来解释一下。

        首先,我们通过扩展函数的方式向 SharedPreferences 类中添加了一个 open 函数,并且它还接收一个函数类型的参数,因此 open 函数自然就是一个高阶函数了。

        由于 open 函数内拥有 SharedPreferences 的上下文,因此这里可以直接调用 edit() 方法来 获取 SharedPreferences.Editor 对象。另外 open 函数接收的是一个 SharedPreferences.Editor 的函数类型参数,因此这里需要调用 editor.block() 对函数 类型参数进行调用,我们就可以在函数类型参数的具体实现中添加数据了。最后还要调用 editor.apply() 方法来提交数据,从而完成数据存储操作。

        如果你将上一节 Kotlin 课堂的内容很好地掌握了,相信这段代码理解起来应该没有什么难度。

        定义好了 open 函数之后,我们以后在项目中使用 SharedPreferences 存储数据就会更加方便 了,写法如下所示:

getSharedPreferences("data", Context.MODE_PRIVATE).open { 
 putString("name", "Tom") 
 putInt("age", 28) 
 putBoolean("married", false) 
} 

        可以看到,我们可以直接在 SharedPreferences 对象上调用 open 函数,然后在 Lambda 表达式中完成数据的添加操作。注意,现在 Lambda 表达式拥有的是 SharedPreferences.Editor 的上下文环境,因此这里可以直接调用相应的 put 方法来添加数据。最后我们也不再需要调用apply() 方法来提交数据了,因为 open 函数会自动完成提交操作。

        怎么样,使用高阶函数简化之后,不管是在易用性还是在可读性上,SharedPreferences的用法是不是都简化了很多?这就是高阶函数的魅力所在。好好掌握这个知识点,以后在诸多其他API 的使用方面,我们都可以使用这个技巧,让 API变得更加简单。

        当然,最后不得不提的是,其实 Google 提供的 KTX 扩展库中已经包含了上述 SharedPreferences 的简化用法,这个扩展库会在Android Studio 创建项目的时候自动引入 build.gradle dependencies 中,如 图7.27 所示。

图7.27        自动引入的 KTX 扩展库

        因此,我们实际上可以直接在项目中使用如下写法来向 SharedPreferences 存储数据:

getSharedPreferences("data", Context.MODE_PRIVATE).edit { 
    putString("name", "Tom") 
    putInt("age", 28) 
    putBoolean("married", false) 
}

        可以看到,其实就是将 open 函数换成了 edit 函数,但是 edit 函数的语义性明显要更好一些。 当然,我前面命名成 open 函数,主要是为了防止和 KTX 的 edit 函数同名,以免你在理解的时候 产生混淆。

        那么你可能会问了,既然 Google 的KTX库中已经自带了一个 edit 函数,我们为什么还编写这个 open 函数呢?这是因为我希望你对于高阶函数的理解不要仅仅停留在使用的层面,而是要知其 然也知其所以然。KTX 中提供的功能必然是有限的,但是掌握了它们背后的实现原理,你将可以 对无限的API进行更多的扩展。

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值