这一章主要讲一讲Kotlin中 for if while等的使用方法
If
Kotlin中 if和java中的if比较相似,至少从代码上来看,是没有太大的区别的
var a: Int = 1
if (a > 0){
a = 0
}
但是有一点需要注意假如是下面这种
var a: Int = 1
var b: Int? = 2
if (a > b){
a = b
}
这样是不行的,因为这里的b是可以为空的,不能直接和a进行比较
这就是kotlin的空指针安全了
那要怎么弄了?
如下
if (a > b!!){
a = b!!
}
这里的双感叹号可以理解为我知道这个不会为空所以请继续走,也可以理解为,我不在乎现在是不是空指针,所以如果不是就直接走一下步,如果是空指针就直接抛异常就是了
上面呢就是和java相似的用法了
下面是不同的
if在kotlin中不仅仅可以用作条件语句,还可以返回一个值
如下
var max = if (a > b) {
a
} else {
b
}
就是说,如果a>b就返回一个a给max,反之则返回一个b给max
需要注意的是,作为一个返回值的时候,返回值必须放到最后一行
而采用这种方式的if必须带有else,否则会报错。
看了这个,我只能双击666了。
原始java如下
int max;
if(a > b){
max = a
}else{
max = b
}
平等来看,其实代码量虽然有增加,但是并没有差距太多。但是贵在简洁,贵在if的多用性,在这种小代码上还看不出来,但是到了复杂的地方就可以很明显了。
不过它的劣势也有,就是默认值的劣势,如下
java:
int max = b;
if(a > b){
max = a;
}
kotlin就不能这样了,max是没有默认值的,必须要通过if和else来进行赋值
这劣势有点生搬硬凑哈。。。
for
for循环相对于java就有很大的变化了,先来看看最简单的for循环
for (num in 0..5) {
array3.add(num)
}
可以看到和java十分的不一样了,首先,没有类似于java分为三段表达
for(int i = 0; i<5; i++){
}
反而有点类似于foreach的用法
这里的 num in 0..5,就代表了定义了一个参数 num,它的的范围是介于0到5之间(两端都是闭包,即同时包括了0.1.2.3.4.5六个数)
每次都进行i++这样的操作
另外这里的范围不仅仅可以用0..5这样,还可以像这样
var nums = arrayOf(2, 4, 6)
for (num in nums) {
println("num" + num)
}
另外,不仅仅是数字,还可以这样
var nums = arrayOf("num1", "num2", "num3")
for (num in nums) {
println("num" + num)
}
再再另外,不仅仅是简单参数,还是可以实体类,不过这个比较好理解了,因为foreach就是实体类
最后,还可以像下面这样
for (arr in array) {
println(arr)
}
for (arr in array.indices) {
println(array[arr])
}
这里是两个for循环,array是一个任意集合或者数组
上面的循环,就是类似于foreach的循环,arr是对应的元素
下面的循环中,用到了array.indices这个方法,这个获取的是array的序列号集合
比如array是一个size为5的数组,通过indices得到的就是(0.1.2.3.4)这样的集合
得到的arr就是一个数组下标
类似于
for(arr in 0..4){
}
更多的用法我暂时没有更深入的研究,在后面的使用中可以继续添加。
最后,上面提到了foreach,kotlin中没有java中的那种foreach函数,但是!
kotlin中是存在foreach的
只是使用方法和java中不一样,如下:
var array1 = arrayOf(1, 2, 3)
array1.forEach {
println(it)
}
需要注意的是里面的it,这个参数,这不是我们自己命名的参数,而是在使用foreach时,循环得到的元素,并且这个it是根据你循环体的类型自动判断类型,如果你循环的是实体类集合,他给你的就是单个的实体类,是不是很无敌,另外forEach比较特殊,本文后面讲标签的时候会讲到
when
这里的when呢,java里面是没有的,只有一个while,但c里面有,其实这个when就是java里面的switch
用法如下
var w = 3
when(w){
0-> println("000")
1,2-> println("111222")
3-> println("333")
else -> println("444")
}
其实就是一个switch case的路数
不过相比于switch case又多了很多的用法
比如,这里的w不仅仅可以是int,还可以是其他的类型(java里面 jdk1.7以后才可以switch 用String类型)
var w = "a2"
when(w){
"a1"-> println("000")
"a2"-> println("111222")
"a3"-> println("333")
else -> println("444")
}
另外这里的分支语句,不仅仅可以用写死的值,还可以用表达式代替
比如
var n = "num:2"
var c = 2
when(n){
getNum(c)-> println("yes")
else -> println("no")
}
fun getNum(num:Int) : String{
return "num:$num"
}
下面的语句是一个方法,传入int类型,返回string类型的一个方法,这个后面会提到
主要看上面,我们的case语句不是一个写死的值,而是一个经过计算的量
另外,重点来了
和if一样,when也可以作为一个带返回值的表达式使用
如下
var w = "a2"
var isTrue = when(w){
"a1"->false
"a2"->true
else->false
}
这个操作就比较厉害了
需要注意的是,如果在进行返回的时候还需要做其他操作,和if一样,返回值需要放在方法的最后一行
var isTrue = when (w) {
"a1" -> {
println(false)
false
}
"a2" -> {
println(true)
true
}
else -> false
}
恩,多行操作需要加一个括号,这个不需要专门说了吧
while
while呢,和java的倒是比较相似
var c = 2
while (c > 0){
c--
}
还有就是do while的用法
var dow = 0;
do {
dow++
} while (dow < 9)
和java类似,就不过多的描述了
另外还有三个跳出语句
break、continue、return
基础用法就仔细写了,如下
for (a in 0..5){
for (b in 3..7){
if (a == b){
break
}
}
}
for (a in 0..5){
for (b in 3..7){
if (a == b){
continue
}
}
}
for (a in 0..5){
for (b in 3..7){
if (a == b){
return
}
}
}
分别是跳出最近的循环、不继续执行后面的语句进入下一次循环、跳出所有循环
在kotlin中还有更深层次的运用--标签
如下
for1@ for (a in 0..5) {
for2@ for (b in 3..7) {
if (a == b) {
continue@for1
}
println("for" + a)
}
}
在循环体前加标签名+@,代表给该层循环命名,在使用continue的时候,代表跳到该层循环继续下一次循环
如上,代表了当a = b时,结束内层循环,a++,进入下一次的循环,这个操作在使用多层(3层即以上)时,效果明显,在只有两层的时候,上面的代码相当于下面:
for (a in 0..5) {
for (b in 3..7) {
if (a == b) {
break
}
println("for" + a)
}
}
break、retun使用标签的用法和continue类似
需要注意的是在使用return时,如果该方法是一个需要返回值的方法,即retun必须要返回一个值时,就不能使用标签
上面for中用到了forEach这个方法,我们还可以这样
nums.forEach {
for (i in 0..6) {
if (i == 3){
return@forEach
}
println(it+":"+i)
}
}
这里的forEach直接就可以作为一个标签来使用
但是需要注意的是,这里只能用return,用break或者continue是不行的
会提示:the label @forEach does not denote a loop
这个标签不能作为一个回路
其实很好理解,break 或者continue都是跳出循环体使用的,但是这里的forEach不能简单视作一个循环体,所以不能使用break或者continue来跳到下一个循环,另外像下面这样使用也是不行的
loop@ for (i in 0..6) {
nums.forEach {
if (i == 3) {
break@loop
}
println(it + ":" + i)
}
}
会提示‘break‘ or ‘continue’ jumps across a function or a class bounary
break或者continue跨越了方法或者类的边界
不怎么好理解,但是大致理解下就是,在forEach循环内部是不允许使用break或者continue来跳到更外层循环的
事实上,不仅仅是采用标签跳出,甚至连基本跳出都是不允许的
for (i in 0..6) {
nums.forEach {
if (i == 3) {
break
}
println(it + ":" + i)
}
}
forEach是比较特殊的,这一点需要注意以上就是kotlin中关于循环控制语句的学习与理解,不难看出,kotlin中的循环语句相对于java方便了很多,但是难能可贵的是,在理解成本上投入却很低,很容易就能学习并掌握住了
Android开发,Kotlin的了解与学习(四)-----基本语法的使用