回到目录
项目源码 kotlin-basics 项目
if
Kotlin 中 if
可以当成传统的 if
使用, 例如:
@Test fun testIf() {
// 可以跟以前以前使用 if
val a = 10
val b = 20
if(a > b) {
assertTrue(a > b)
} else {
assertTrue(!(a > b))
}
}
Kotlin 中 if
是表达式, 即它会有一个返回值. 如果把 if
当做表达式用, 必须写成完整
的 if else
语句.
@Test fun testIfExpr() {
// if 是表达式
val a = 10
val b = 20
val c = if(a > b) a else b
assertTrue(c == b)
// Kotlin 中不可以这样, 也不需要它了
// if 完美替代, 可读性更好
// val x = a > b? a: b
// 花括号也是可以的, 返回的是花括号内最后表达式的值
val max = if (a > b) {
println("a is greater than b")
a
} else {
println("a is not greater than b")
b
}
assertEquals(b, max)
}
嵌套使用 if else
也是没问题的.
@Test fun testNestedIf() {
val a = 3
val b = 5
val c = 1
val max = if (a > b) {
if (a > c)
a
else
c
} else {
if (b > c)
b
else
c
}
assertTrue(max == 5)
}
超级牛逼的 when
将 when
之前先介绍一下 kotlin 中的范围(Range)语法, 比如 1..10
表示 IntRange 类
型. 是数学中封闭的 [1, 10]
区间内所有整数的概念. 还有 CharRange
, LongRange
.
when
形式上比较像 java 的 switch
, 但是 Kotlin 中的 when
十分牛逼.
跟 if
一样, 可以当成语句使用, 也可以当成一个表达式, 如果作为表达式,
when
中必须带上 else
分支, 除非编译器能检查到你的分支已经覆盖全部情况.
/**
* 演示 when 作为语句使用
*/
@Test fun testWhen() {
val a = 10
when(a) {
1 -> assertTrue(a == 1) // 只有简单一个表达式可以省略花括号
3 -> { assertTrue(a == 3) }
5 -> { println("a = $a") }
else -> println("a > 5") // 作为语句时, 可以不写 else 的.
}
}
/**
* 演示 when 作为表达式
*/
@Test fun testWhenExpr() {
val a = 6
val result = when(a) {
1 -> "a == 1"
3 -> {
println(" a == $a")
"a == 3"
}
5 -> { "a == 5" }
else -> "a > 5"
}
assertEquals("a > 5", result)
}
分支合并功能了解一下:
@Test fun testWhenMerge() {
val n = 2
val result = when (n) {
1, 2, 3 -> "x"
4 -> "xx"
else -> "xxx"
}
assertEquals("x", result)
}
配合 range, 达到范围检测的功能:
@Test fun testWhenRange() {
val n = 40
val result = when (n) {
in 1..10 -> 1
in 11..20 -> 2
in 21..30 -> 3
in 31..40 -> 4
in 41..50 -> 5
else -> 10
}
assertTrue(result == 4)
}
for
for
循环 range 类型
for
与 range
一起用, 十分方便:
@Test fun testFor() {
for(a in 1..10) { // a 前面不要写 var
println(a)
}
}
在 kotlin 中, 如果一个语句块(使用 {}
包裹的代码段)里面只有一条语句, 那么 {}
是可以省略不写的.
@Test fun testForOneExpr() {
// 只有一个语句, 可以省略花括号
for(a in 1..10)
println(a)
// 或者写在同一行
for(a in 11..20) println(a)
}
range 有很多形式, 1..10
这种是最常用的, 还有例如 10 downTo 1
, 1..10 step 3
等各种用法, 满足各种循环需求
for
循环数组类型
有三种形式
- 循环里面的元素, 不带索引的
@Test fun testForArrayItem() {
val names = arrayOf("aaa", "bbb", "ccc")
for(name in names)
println(name)
}
- 循环里面的索引
@Test fun testForArrayIndex() {
val names = arrayOf("aaa", "bbb", "ccc")
// 数组的 indices 属性会返回一个 IntRange
for(index in names.indices)
println(names[index])
}
- 两个一起循环
@Test fun testForArrayIndexItem() {
val names = arrayOf("aaa", "bbb", "ccc")
for((index, item) in names.withIndex())
println("第 ${index + 1} 个名字是 $item")
}
(index, item) in names.withIndex()
这种语法你可能会比较陌生, 其实这是一种解构
赋值. withIndex()
返回一个可迭代的集合, 里面的元素是 IndexedValue
类型, 这是一个数据类, 而数据类已经默认实现解构赋值了.
解构赋值的详细知识点以后会讲到.
while
while
和 do while
跟 java 中的没区别.
回到目录