你需要懂的Kotlin开发技巧之七

3,021 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情

1.kotlin中的for循环

  • 第一种 ..
for (i in 0..5) {
    println(i)
}

正序输出 :0 1 2 3 4 5,这是一个左闭右闭区间

  • 第二种 until
for (i in 0 until 5) {
    println(i)
}

正序输出:0 1 2 3 4,这是一个左闭右开区间

  • 第三种 downTo
for (i in 5 downTo 0) {
    println(i)
}

倒序输出:5 4 3 2 1 0,这是一个左闭右闭区间

  • 第四种 step 这种是带步长的,比如:
for (i in 0 until 5 step 2) {
    println(i)
}

输出:0 2 4,可以看到步长设置为2就隔2输出

  • 第五中 zip
for((i, j) in (1..5).zip(5..10))  {
    println("$i -- $j")
}

zip支持两个参数,看下输出:

image.png

2.use扩展函数

平常从文件输出输入流中进行读写,需要在读写完毕之后调用close方法关闭输出或输入流,防止产生异常,但是要求是要求,程序开发的时候还有有概率漏写的。

所以kotlin提供了一个user扩展方法帮助我们关闭流,先看下使用:

File("").outputStream().use {
}

使用use后就不需要程序手动关闭流了,看下use源码:

image.png

同理,读写数据库中的cursor也支持使用use

3.密封类sealed class

密封类的定义如下:

sealed class Kit {
    data class H(val name: String = "")
    data class O(val age: Int = 0)
    data class L(val show: Boolean = false)
}

其实密封类和抽象类、枚举非常像,但是有两个非常显著区别于抽象类、枚举的优点:

  • 类结构层次化(相比较抽象类)

抽象类的具体实现类可以定义在包内的各个位置,非常不方便管理,而密封类具有层次化结构,即密封类的子类只能和密封类定义在同一个类文件中。当然,kotlin1.4之后的版本不会限制这么严格

  • 子类对象支持动态创建(相比较枚举)

java实现单例最安全的方式就是利用枚举实现。枚举声明的每个元素内容都是固定的,无法通过外部传入参数。而密封类的子类可以声明为object,这个效果就和枚举元素一样,也可以声明为普通的class,可以外部进行传参创建类的对象