If表达式
跟Java中类似
fun method(){
val max:Int
val a=120
val b=50
if (a>b){
max=a
}else{
max=b
}
}
老习惯,Kotlin有更加简化版本
//if表达式 三元表达式
fun ifMethod2() {
val a = 100
val b = 50
val max = if (a > b) a else b
}
Kotlin中 不支持三目运算符 , 所以 只能用上述的方式实现Java中三目运算符;
如果需要在带返回值的 if-else中加入各种操作,还可以写成这样
fun ifMethod3() {
val a = 100
val b = 50
val max = if (a > b) {
println("a=$a")
a //默认最后一行是返回值 连return都剩下了
} else {
println("b=$b")
b //默认最后一行是返回值 连return都剩下了
}
}
When
When代替了Java中的switch;
fun whenMethod(x:Int){
when(x){
1 -> println(1) // -> 类似于Java中的case 后面带语句,
2 ->{
println(2)
}
3 -> println(3) //只有一行时 大括号可以忽略
100-> println("Max")
else -> print("end")
}
}
实例中,当我们需要在多个不同的Case里面时候做相同的处理,Java中只能不断增加Case,而Kotlin中,我们可以简化成这样
fun whenMethod2(x:Int){
when(x){
1,2,3 -> println(1) // -> 命中1,2,3其中一个即可
100-> println("Max")
else -> print("end")
}
}
直接用,
隔开,代表只需要命中其中一个即可,大大简化了我们的操作
如果需要表明一个区间,比如 1~99 Java中只能用If-else了,而Kotlin中,可以这样
fun whenMethod3(x: Int) {
when (x) {
in 1..99 -> print(x) // -> 用 in ...表示区间
!in 200..300 ->print("200~300")
// 用 !in表示不在这个区间
100 -> println("Max")
else -> print("end")
}
}
in ...
表示区间,而 !in ...
标志不再哪个区间,其中,区间包括声明的数字(例子中1和99都包括)
Java中 switch值只能是Int
,Float
或者 枚举
,String(JDK7)
等常量,而Kotlin不受此限制,可以为变量,甚至,可以是个表达式
fun whenMethod4(x: Int) {
when (x) {
parseInt(x) -> print(x) // -> 可以是任意表达式
100 -> println("Max")
else -> print("end")
}
}
private fun parseInt(x: Int): Any {
return x
}
虽然这个表达式可以返回Any
(类似于Java中的Object
)类型,但是其实只有返回跟输入类型相同类型(此处是Int),表达式才算通过;
那么问题来了
以下表达式,你认为输入1~200,会执行谁 ?
fun whenMethod5(x: Int) {
when (x) {
x -> print(x) // -> 不限制为常量,可以使变量
100 -> println("Max")
else -> print("end")
}
}
还有一种,不给when提供参数,则默认里面的条件都是boolean值
fun whenMethod6(x: Int) {
when {
x > 10 -> print(x) // -> 分支条件都是Boolean值,
x > 20 -> println("Max")
else -> print("end")
}
}
For循环
Kotlin中for循环用in表示
fun forMethod(args:List<String>){
for (s in args){//类似于 for(s:args)循环
println(s)
}
}
那我想遍历index怎么办
fun forMethod2(args:List<String>){
for (index in args.indices){//类似于 for(s:args)循环
println(index)
println(args[index])
//这种kotlin会编译成优化的实现而不会创建额外对象
}
}
array.
indices来获取集合的index;而且有特殊的优化,保证效率
更进一步,同时获取index和Value,用in array:withIndex()
fun forMethod4(array:List<String>){
for ((index,value) in array.withIndex()){
//用 in array:withIndex()来获取index和value
println(value)
}
}
更多内容,请参照
| Kotlin中创建一个可迭代的对象http://www.jianshu.com/p/edf38895de1c))http://www.jianshu.com/p/edf38895de1c
while 和do while
这两个和Java中完全一致
fun whileMethod(array:List<String>){
val iterator=array.iterator()
while (iterator.hasNext()){
println(iterator.next())
}
}
do-while就不展示了
循环控制
Break 和 Continue 标签
在 Kotlin 中任何表达式都可以用标签(label)来标记。 标签的格式为标识符后跟 @
符号,例如:abc@
、fooBar@
都是有效的标签,标签内容可以是任意,只是为了做一个标记,然后,可以利用标签跳转到任何位置
fun funForeLable() {
loop@ for (i in 1..100) {
for (j in 1..100) {
if (i == 10) {
break@loop
}
println("i=$i j=$j")
}
}
}
输出
i=1 j=1
i=1 j=2
i=1 j=3
......//省略部分输出
i=9 j=100
利用@loop标签,程序执行到10的时候,就跳出到最外层的for,导致程序无法执行,所以i只能到10,而不加 则默认i会到100
当lambda表达式嵌套时,return默认从包围它的函数返回,而不是lambda表示式
fun funReturnLable2(){
(0..100).forEach {
if (it == 0) return
println(it)
}
println("aaa")
}
aaa永远都不会被打印出来
必须加入@(lambda表达式名) 如@forEach
,表示从此lambda表达式返回
fun funReturnLable(){
(0..100).forEach {
if (it == 0) return@forEach
println(it)
}
println("aaa")
}
此时输出
1
2
.....
100
aaa