一起养成写作习惯!这是我参与「掘金日新计划 · 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
支持两个参数,看下输出:
2.use
扩展函数
平常从文件输出输入流中进行读写,需要在读写完毕之后调用close
方法关闭输出或输入流,防止产生异常,但是要求是要求,程序开发的时候还有有概率漏写的。
所以kotlin提供了一个user
扩展方法帮助我们关闭流,先看下使用:
File("").outputStream().use {
}
复制代码
使用use
后就不需要程序手动关闭流了,看下use
源码:
同理,读写数据库中的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,可以外部进行传参创建类的对象