Android开发中我所用到的Kotlin便利操作

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8天,点击查看活动详情

Kotlin 扩 展(Extensions)

Kotlin 可以为一个不能修改的或来自第三方库中的类编写一个新的函数。 这个新增的函数就像那个原始类本来就有的函数一样,可以用普通的方法调用,这种机制的函数称为扩展函数

Kotlin 能够扩展一个类的新功能而无需继承该类。 例如,你可以为一个你不能修改的来自第三方库中的类编写一个新的函数。 这个新增的函数就像那个原始类本来就有的函数一样,可以用普通的方法调用。 这种机制称为扩展函数 。此外,也有扩展属性,允许你为一个已经存在的类添加新的属性。想想是不是感觉很疯狂呢?那接下来就往我们开启这种疯狂吧。

3236890-30decb4cd1d83177.webp

创建一个时间戳转换为分钟的扩展函数:

/**
 * 转换时间  分钟
 */
fun Long.transTimeOfMinute(): String {
    var minute = this / (60 * 1000)
    if (this / 1000 % 60 > 0) {
        minute += 1
    }
    return "$minute"
}
//这里直接Long类型调用即可
val minute = 1675820443000.transTimeOfMinute()

是不是使用起来相当便利,只要你喜欢项目中常用到的函数基本都可以抽写为扩展函数。那么问题来了,它是怎么实现的,会不会有性能相关的问题呢?那我们通过Kotlin反编译出来的Java文件来看看:

@NotNull
public static final String transTimeOfMinute(long $this$transTimeOfMinute) {
   long minute = $this$transTimeOfMinute / (long)'\uea60';
   if ($this$transTimeOfMinute / (long)1000 % (long)60 > 0L) {
      ++minute;
   }

   return String.valueOf(minute);
}

从反编译出的 Java 源码分析,扩展函数的实现非常简单,它没有修改接受者类型的成员, 仅仅是通过静态方法来实现的。所以我们不必担心扩展函数会带来额外的性能消耗。

真实感受就是从java转Kotlin后就再也回不去了。大量的语法糖,本身使用Java需要十行的代码在Kotlin可能仅仅需要两三行甚至一行。自定义实体也自动处理了get、set、toSting等函数,再加上扩展函数的加持,是的代码量大幅度减少。所谓写的越少,出现问题的概率就越少。

下面说说一些常用到的函数:
1. any 集合中只要有一项满足条件则返回true,否则返回false
val list = listOf(1, 2, 3)
val boolean = list.any { it > 2 }
Log.e("打印:", "$boolean")//结果为true
2. all 集合中所有项都满足脚尖则返回ture,否则返回false

这个语法糖如果使用Java操作,for循环内还需计数,判断满足条件数量和集合数量相等。在kotlin中简单一句代码解决。

val list = listOf(1, 2, 3)
val boolean = list.all { it > 0 }
Log.e("打印:", "$boolean")//结果为true
3. count 统计集合中满足条件的个数

当count数等于list的size时,效果就和all一样

val list = listOf(1, 2, 3)
val count = list.count { it > 2 }
Log.e("打印:", "$count")//结果:1
4.filter 筛选出所有符合条件的元素,返回类型是List

这里返回的类型和原list类型一致

val list = listOf(1, 2, 3)
val filter = list.filter { it > 2 }
Log.e("打印:", "$filter")//结果:[3]
5.firstOrNull 返回第一个满足条件的元素,没有则返回Null

注意使用first时,如果没有符合的元素会抛异常,所以通常使用firstOrNull,再进行判空

val list = listOf(1, 2, 3)
val firstOrNull = list.firstOrNull { it > 1 }
Log.e("打印:", "$firstOrNull")//结果:2
6.flatMap 遍历每一个元素,并铺平元素。入参必须是Iterable,返回结果是List

通常可结合map一起使用,list.flatMap { itemList.map{...} }

val list = listOf(listOf(1,2),listOf(3,4),listOf(5,6))
val flatMap = list.flatMap { it }
Log.e("打印:", "$flatMap")//结果:[1, 2, 3, 4, 5, 6]
7.map 返回一个每个元素都根据给定函数条件转换的数组

返回全新类型的list,类型就是花括号内的结果

val list = listOf(listOf(1,2),listOf(3,4),listOf(5,6))
val map = list.map { it }
Log.e("打印:", "$map")//结果:[[1, 2], [3, 4], [5, 6]]
val list = listOf(listOf(1,2),listOf(3,4),listOf(5,6))
val map = list.map { it[0] }
Log.e("打印:", "$map")//结果:[1, 3, 5]
8.apply 调用某对象的apply函数,在函数范围内,可以任意调用该对象的任意方法,并返回该对象

用于初始化对象或转换对象相当便利

companion object {
    fun newInstance(id: String?) = TestFragment().apply {
        arguments = Bundle().apply {
            putString(Tags.ID, id)
            ......
        }
    }
}

当然,Kotlin还有很多文中未提到的优点,以上仅个人使用中的部分内容,希望对大家有所帮助!

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情