先创建一个简单的集合,方便我们进行演示
val mList = listOf(1, 2, 3, 4)
1.if表达式
Kotlin中一切都是表达式,也就是说一切都可以返回一个值。首先if语句我们可以像Java中那样使用它:
if (condition) {
//do something
} else if (condition) {
//do something
} else {
//do something
}
其次,我们也可以把结果赋值给一个变量:
var z = if(condition) x else y
所以 if 表达式总是返回一个value。如果一个分支返回了Unit,那整个表达式也将
返回Unit,它是可以被忽略的,这种情况下它的用法也就跟一般Java中的 if 条件
一样了。
//if条件表达式
mList.forEach {
if (it > 2)
Log.i(TAG, it.toString()) else toast(it.toString())
}
运行结果:
09-10 20:02:57.272 31586-31586/com.example.lbjfan.kotlindemo I/LBJFAN: 3
09-10 20:02:57.273 31586-31586/com.example.lbjfan.kotlindemo I/LBJFAN: 4
2.When表达式
when表达式类似于Java中的switch/case语句,但是更加强大,该表达式会试图去匹配所有可能的分支,然后找到满意的一个语句,执行右边的表达式。与Java中的表达式不同的是他可以匹配任意类型的参数,并且分支也可以是一个条件。我们也可以增加一个else语句,当没有任何语句匹配时,该语句会执行!
//When条件表达式:简单的匹配Int类型
mList.forEachIndexed { index, value ->
when (value) {
//执行最先匹配的一条语句
//is Int -> Log("Value is Int")
1, 2 -> Log.i(TAG, "index:$index--value:$value")
3 -> Log.i(TAG, "value:$value--value:$index")
else -> {
Log.i(TAG, "else value:$value--value:$index")
}
}
}
运行结果:
09-10 20:11:40.148 8634-8634/com.example.lbjfan.kotlindemo I/LBJFAN: index:0--value:1
09-10 20:11:40.148 8634-8634/com.example.lbjfan.kotlindemo I/LBJFAN: index:1--value:2
09-10 20:11:40.148 8634-8634/com.example.lbjfan.kotlindemo I/LBJFAN: value:3--value:2
09-10 20:11:40.149 8634-8634/com.example.lbjfan.kotlindemo I/LBJFAN: else value:4--value:3
//when条件表达式任意类型,且判断条件是一个表达式
val mViewList = listOf(TextView(this), Button(this), ImageView(this))
mViewList.forEachIndexed { index, view ->
when (view) {
//执行完条件语句会自动转型,不用像Java做类型转换
is TextView -> Log("index$index:is TextView")
is Button -> Log("index$index:is Button")
is ImageView -> Log("index$index:is ImageView")
else -> {
Log(" is Other View")
}
}
}
运行结果:
09-10 20:11:40.157 8634-8634/com.example.lbjfan.kotlindemo I/LBJFAN: index0:is TextView
09-10 20:11:40.157 8634-8634/com.example.lbjfan.kotlindemo I/LBJFAN: index1:is TextView
09-10 20:11:40.157 8634-8634/com.example.lbjfan.kotlindemo I/LBJFAN: index2:is ImageView
3.for循环
虽然Kotlin中有很多功能强大的操作集合的函数操作符,但是如果去查看源码的话,不难发现,全都是基于最简单的迭代!
//直接获取item
for (value in mList) {
Log("value:$value")
}
运行结果:
09-10 20:25:39.620 21866-21866/com.example.lbjfan.kotlindemo I/LBJFAN: value:1
09-10 20:25:39.620 21866-21866/com.example.lbjfan.kotlindemo I/LBJFAN: value:2
09-10 20:25:39.621 21866-21866/com.example.lbjfan.kotlindemo I/LBJFAN: value:3
09-10 20:25:39.621 21866-21866/com.example.lbjfan.kotlindemo I/LBJFAN: value:4
//使用index获取item
for (index in 0..mList.size - 1) {
Log("index:$index--value:${mList.get(index)}")
}
运行结果:
09-10 20:25:39.621 21866-21866/com.example.lbjfan.kotlindemo I/LBJFAN: index:0--value:1
09-10 20:25:39.621 21866-21866/com.example.lbjfan.kotlindemo I/LBJFAN: index:1--value:2
09-10 20:25:39.621 21866-21866/com.example.lbjfan.kotlindemo I/LBJFAN: index:2--value:3
09-10 20:25:39.621 21866-21866/com.example.lbjfan.kotlindemo I/LBJFAN: index:3--value:4
4.While和do/while循环
Kotlin中的While和do/while语句和Java中的一样
while语句:
//While语句
var x = 6
while (x > 0) {
Log("x:$x")
x--
}
运行结果:
09-10 20:31:45.286 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: x:6
09-10 20:31:45.286 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: x:5
09-10 20:31:45.286 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: x:4
09-10 20:31:45.286 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: x:3
09-10 20:31:45.286 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: x:2
09-10 20:31:45.287 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: x:1
do/while语句:
//do/while语句
var y = 6
do {
Log("y:$y")
y--
} while (y > 0)
运行结果:
09-10 20:31:45.287 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: y:6
09-10 20:31:45.287 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: y:5
09-10 20:31:45.287 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: y:4
09-10 20:31:45.287 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: y:3
09-10 20:31:45.287 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: y:2
09-10 20:31:45.287 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: y:1
5.Ranges
range表达式使用..操作符,他是被定义实现了一个rangTo方法,可以帮助我们使用很多富有创造性的方式去简化我们的代码:例如:
if (x >= 0 && x <= 10) {
Log("x:$x")
}
等价于:
if (x in 0..10) {
Log("x:$x")
}
Range 被定义为可以被比较的任意类型,但是对于数字类型,比较器会通过转换
它为简单的类似Java代码来避免额外开销的方式来优化它。数字类型的 ranges 也
可以被迭代,编译器会转换它们为与Java中使用index的for循环的相同字节码的方
式来进行优化。
range默认自增长,因此下面的代码不会做任何事情
if (x in 10..0) {
Log("x:$x")
}
对应的,要想使上面语句执行,我们可以使用downTo函数
if (x in 10 downTo 0) {
Log("x:$x")
}
运行结果:
09-10 20:48:43.353 11479-11479/com.example.lbjfan.kotlindemo I/LBJFAN: 3
09-10 20:48:43.353 11479-11479/com.example.lbjfan.kotlindemo I/LBJFAN: 2
09-10 20:48:43.353 11479-11479/com.example.lbjfan.kotlindemo I/LBJFAN: 1
09-10 20:48:43.353 11479-11479/com.example.lbjfan.kotlindemo I/LBJFAN: 0
我们也可以在range中使用step来定义一个到一个值的不同的空隙
for (it in 1..4 step 3) {
Log(it.toString())
}
运行结果:
09-10 20:52:44.699 15648-15648/com.example.lbjfan.kotlindemo I/LBJFAN: 1
09-10 20:52:44.699 15648-15648/com.example.lbjfan.kotlindemo I/LBJFAN: 4
for (it in 4 downTo 1 step 2) {
Log(it.toString())
}
运行结果:
09-10 20:52:44.700 15648-15648/com.example.lbjfan.kotlindemo I/LBJFAN: 4
09-10 20:52:44.700 15648-15648/com.example.lbjfan.kotlindemo I/LBJFAN: 2
6.until函数
与range表达式不同的是until遍历时会跳过最后一个值:
for (it in 1 until 4) {
Log(it.toString())
}
运行结果:
09-10 20:58:22.463 21094-21094/com.example.lbjfan.kotlindemo I/LBJFAN: 1
09-10 20:58:22.463 21094-21094/com.example.lbjfan.kotlindemo I/LBJFAN: 2
09-10 20:58:22.463 21094-21094/com.example.lbjfan.kotlindemo I/LBJFAN: 3
如果不使用until函数,我们使用index遍历数组时:
//使用index获取item
for (index in 0..mList.size - 1) {
Log("index:$index--value:${mList.get(index)}")
}
使用until函数
for (index in 0 until mList.size) {
Log("index:$index--value:${mList.get(index)}")
}