控制流语句是决定程序执行方向的重要语句。
Java中的控制流语句有
if...else...switch...case...try...catch...- 三元表达式
- 等等
Kotlin中的控制流语句有
if...else...when...try...catch...- 等等
在Kotlin中,控制流语句不仅仅是控制程序走向,同时还是表达式,有自己的返回值,被称为分支表达式。
if...else...
在Java中,if...else...是常见的控制流语句:
//Java
public static void main (String[] args) {
int a = 4;
boolean isPositive = (a > 0);
int b;
if (isPositive) {
b = a;
} else {
b = -a;
}
}
在Kotlin中,可以同Java一样,仅用作控制流语句:
//Kotlin
fun main() {
var a = 4
var isPositive = (a > 0)
var b = 0
if(isPositive){
b = a
}else{
b = -a
}
}
同时,在Kotlin中我们还能将if...else...作为一个表达式,类似于三元表达式:
//Kotlin
fun main() {
var a = 4
var isPositive = (a > 0)
var b = if (isPositive) a else -a
}
注意!当
if...else...用作控制流语句时,两个分支应该是语句;当用作表达式时,两个分支应该是值或者表达式,而不是一个语句。
when...
在Java中,当基于同一个变量的控制流分支过多时,可以使用switch...case...:
//Java
public class Example {
public static void main(String[] args) {
int a = 4;
int b;
switch (a) {
case -10:
b = 10;
break;
case 0:
b = 0;
break;
case 10:
b = 10;
break;
default:
b = a;
}
}
}
在Kotlin中,没有switch...case...语句,取而代之的是when...语句:
//Kotlin
fun main() {
var a = 4
var b = 0
when (a) {
-10 -> b = 10
0 -> b = 0
10 -> b = 10
else -> b = a
}
}
在Kotlin中,不需要break关键字来跳出每一个case的执行,默认就有break的效果,同时,默认的关键字不再是default而是else。
同时,上面的语句也可以写作一个表达式:
//Kotlin
fun main() {
var a = 4
var b = 0
b = when (a) {
-10 -> 10
0 -> 0
10 -> 10
else -> a
}
}
与
if...else...相同,要注意什么时候在分支用语句,什么时候在分支用表达式!
另外,when...语句还能将条件转移到分支:
//Kotlin
fun main() {
var a = 4
var b = 0
when {
a == -10 -> b = 10
a == 0 -> b = 0
a == 10 -> b = 10
else -> b = a
}
}
如图所示,当when后面不跟传入参数的时候,表示条件判断直接在分支进行判断。同样也可以写成分支表达式:
//Kotlin
class Example {
fun main() {
var a = 4
var b = 0
b = when {
a == -10 -> 10
a == 0 -> 0
a == 10 -> 10
else -> a
}
}
}
从Kotlin 1.3开始,我们还能在when的传入参数处进行控制台输入:
//Kotlin
class Example {
fun main() {
var b = 0
b = when(val a = readLine()) {
null -> 0
else -> a.length
}
}
}
try...catch...
//Kotlin
fun main() {
var a = 1
var b = 2
var c: Int
try {
c = a/b
}catch (e : Exception) {
e.printStackTrace()
c = 0
}
}
写作分支表达式:
//Kotlin
fun main() {
var a = 1
var b = 2
var c: Int
c = try {
a/b
}catch (e : Exception) {
e.printStackTrace()
0
}
}