覆盖案例
var maxSurfaceTempIntK: Any = 100
fun calcNum() = 600
when(maxSurfaceTempIntK) {
700 -> println("Equal 700")
0, 1 , 2 -> println("Equal 0, or 1, etc...")
in 20..300 -> println("num in range")
!in 300..400 -> println("num not in range")
calcNum() -> println("result of fucntion")
is Int -> println("boolean or type")
else -> println("default branch")
}
val ans = when(maxSurfaceTempIntK) {
calcNum() -> calcNum() * 10
else -> -1
}
println("ans = $ans")
反编译看一下JVM平台下的实现
if (Intrinsics.areEqual(var2, 700)) {
} else if (!Intrinsics.areEqual(var2, 0) && !Intrinsics.areEqual(var2, 1) && !Intrinsics.areEqual(var2, 2)) {
byte var5 = 20;
if (CollectionsKt.contains((Iterable)(new IntRange(var5, 300)), var2)) {
} else {
short var6 = 300;
if (!CollectionsKt.contains((Iterable)(new IntRange(var6, 400)), var2)) {
} else if (Intrinsics.areEqual(var2, ((Practice)this).calcNum())) {
} else if (var2 instanceof Integer) {
} else {
}
}
} else {
var3 = "Equal 0, or 1, etc...";
System.out.println(var3);
}
var2 = ((Practice)this).maxSurfaceTempIntK;
this.ans = Intrinsics.areEqual(var2, ((Practice)this).calcNum()) ? ((Practice)this).calcNum() * 10 : -1;
-
when表达式没有使用Java switch的语法糖,转换为嵌套if…elseif…else的语法。
-
在判断是否为1,2,3的时候,编译器做了if !else 的操作。
-
带返回值的when, 会被转换为Java三目表达式。