Kotlin的导包和Java区别不大。
Kotlin中有一些包是默认被导入所有Kotlin文件中的:
- kotlin.*
- kotlin.annotation.*
- kotlin.collections.*
- kotlin.comparisons.*
- kotlin.io.*
- kotlin.ranges.*
- kotlin.sequences.*
- kotlin.text.*
其它有些默认包取决于目标平台:
比如JVM
:
- java.lang.*
- kotlin.jvm.*
如果是JS
:
- kotlin.js.*
如果包名有冲突,为了区别不同的包,可以使用as关键字给包起一个别名:
import foo.Bar // Bar is accessible
import bar.Bar as bBar // bBar stands for 'bar.Bar'
Kotlin的流程控制主要就是 if
, when
, for
,while
四种表达式,因为支持各种简写方式,所以用起来比Java中的流程控制要灵活的多,至于如何使用之前的文章里都提到过,这里不详细介绍了。这里要详细介绍的是流程控制中的返回和跳转的用法。
Kotlin中有三种跳转方式:
- return
从当前的函数或匿名函数返回
- break
结束当前的循环
- continue
直接跳到下一次循环
在Kotlin中任何表达式都可以用标签来标记,标签的格式为标识符
后面跟一个@
符号,如:abc@, loop@。要标记一个表达式,只需要把标签放在表达式前面即可。如下:
loop@ for (i in 1..100) {
// ...
}
然后我们就能通过标签来结束一个循环或进行下一次循环
loop@ for(i in 1..10){
for(j in 10 downTo 1){
if(i % j == 0) {
println("i = $i; j = $j")
break@loop
}
}
}
运行上面的代码,输出的结果为:
i = 1; j = 1
可以看到,当i
第一次能被j
整除的时候,语句break@loop
就直接结束了最外层的for循环。
如果把break
换成continue
,会输出什么结果呢?
i = 1; j = 1
i = 2; j = 2
i = 3; j = 3
i = 4; j = 4
i = 5; j = 5
i = 6; j = 6
i = 7; j = 7
i = 8; j = 8
i = 9; j = 9
i = 10; j = 10
当i
第一次能被j
整除的时候,通过语句continue@loop
,直接让最外层的进行下一次循环。如果没有调用continue@loop
,在i=2;j=2被打印出来之后,内层循环会继续,那么i=2;j=1也会被打印出来。
用法和上面的差不多,看下面这段代码:
fun foo() {
listOf(1, 2, 3, 4, 5).forEach lit@{
if (it == 3) return@lit // local return to the caller of the lambda
print(it)
}
print(" done with explicit label")
}
打印出来的结果为:
1245 done with explicit label
当循环到3
时,通过return@lint
返回到lambda表达式处,继续循环。
对于只从lambda表达式返回的情况,通常可以使用隐式标签,例如使用和lambda所传递的函数同名的标签。如下:
fun foo() {
listOf(1, 2, 3, 4, 5).forEach {
if (it == 3) return@forEach
print(it)
}
print(" done with implicit label")
}
打印的结果和上一个结果一样。
还有一些其它内容,可以参考 官方文档,我觉得不是特别重要,只要了解有标签这么一个东西就行了,以及适当的时候使用一下。