kotlin学习笔记——过程控制和Range表达式

Kotlin学习笔记系列:http://blog.csdn.net/column/details/16696.html

1、if表达式

在kotlin中一切都是表达式,都可以返回一个值。所以if表达式也总是返回一个value。所以可以:
var s = if (isExit) x else y
这样我们就不需要java中那样得三元符“?:”

2、when表达式

与java中的switch/case类似,但是要强大的多。这个表达式会匹配分支,如果有匹配的则运行右边的表达式。
  • 对于默认的选项可以增加else分支(与java中的defualt类似)
  • 与java的switch/case不同的是,参数可以是任何类型,也可以是一个条件
  • 一个条件也可以是多个逗号分隔的值
如:
when(x){
     0, 1 -> print("1")
     2 -> print("2")
     else -> {
          print("else")
          ...
     }
}
同样作为表达式也可以返回一个值,如:
val a = when(x){
     ...
}
当需要返回一个值时,由于必须要返回,所以必须覆盖所有的可能性分支或实现else,否则不会被编译成功。当不需要返回时,则不需覆盖所有可能性。
更强大的是,我们可以检测参数类型进行判断,如:
when(view){
     is TextView -> view.setText("test")
     is EditText -> toast("value is ${view.getText()}")
     else -> view.visibility = View.GONE
}
通过is判断后,参数会被自动转型,所以不需要明确的做类型转换。
它还可以检测参数是否在一个数组范围甚至是一个集合范围内,如:
val cost = when(x){
     in 0..10 -> "cheap"
     in 10..100 -> "regular"
     in specialValues -> "special"
     else -> "not raded"
}
它甚至可以摆脱参数,代替if/else链,如:
val res = when{
     x in 0..10 -> "cheap"
     y.contains("hello") -> "hello world"
     v is EditText -> v.getText()
     else -> ""
}
注意:(1)使用when时参数可以为null,如果没有匹配的分支则什么都不发生或执行else分支。
         (2)如果有多个分支满足条件,当匹配到第一个时即返回,其他匹配的分支不再执行

3、for循环

kotlin提供了很多集合的操作符可以使我们不必过多的使用for,但是for仍是有用的。
for(item in collection){
     ...
}
在for中我们也可以使用ranges,如:
for(index in 0..parent.getChirldCount() - 1){
     ...
}
对于迭代一个Collection(array或list)的index,可以使用Collection的indices属性,如
for(index in array.indices){
     ...
}
通过观察源码可以指定, indices是一个IntRange类型,它的值是0..size-1,所以说它是一个collection所有index的range。

4、while和do/while

这两个不是特别常用,基本与java和上面的用法类似。

5、try和throw

在kotlin中几乎一切都是表达式,都可以返回一个值,所以可以
val a = try{ ... }catch{ null }
fun do( ... ): Persion? = throw Expection()
注意:上面的例子可以看到,返回一个exception时,虽然与返回类型不相同也是可以的。

6、range

Range表达式使用一个“..”操作符,它是被定义实现了了一个RangeTo方法
if(i in 0..10){
     ...
}

Range用于任何可以被比较的类型,但对于数字类型比较器会转换为类似java的简单代码来避免额外开销来优化它。
而且注意,数字类型的Range可以用于迭代,如:
for(i in 0..10){
     ....
}

Range默认是自增长的,如果是for(i in 10..0)则不会做任何事情,这时可以使用downTo,如:
for(i in 10 downTo 0){
     ...
}

我们还可以 使用step来定义间隙,如:
for(i in 1..4 step 2){
     ...
}
上面的代码只会遍历到1、3

如果想创建一个开区间,可以使用until,如:
for(i in 0 until 4){
     ...
}
就等同于0..3,不包括最后的。

你可能感兴趣的:(Kotlin,Kotlin学习笔记)