回到目錄
項(xiàng)目源碼 kotlin-basics 項(xiàng)目
if
Kotlin 中 if 可以當(dāng)成傳統(tǒng)的 if 使用, 例如:
@Test fun testIf() {
// 可以跟以前以前使用 if
val a = 10
val b = 20
if(a > b) {
assertTrue(a > b)
} else {
assertTrue(!(a > b))
}
}
Kotlin 中 if 是表達(dá)式, 即它會(huì)有一個(gè)返回值. 如果把 if 當(dāng)做表達(dá)式用, 必須寫成完整
的 if else 語句.
@Test fun testIfExpr() {
// if 是表達(dá)式
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
// 花括號(hào)也是可以的, 返回的是花括號(hào)內(nèi)最后表達(dá)式的值
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)
}
超級(jí)牛逼的 when
將 when 之前先介紹一下 kotlin 中的范圍(Range)語法, 比如 1..10 表示 IntRange 類
型. 是數(shù)學(xué)中封閉的 [1, 10] 區(qū)間內(nèi)所有整數(shù)的概念. 還有 CharRange, LongRange.
when 形式上比較像 java 的 switch, 但是 Kotlin 中的 when 十分牛逼.
跟 if 一樣, 可以當(dāng)成語句使用, 也可以當(dāng)成一個(gè)表達(dá)式, 如果作為表達(dá)式,
when 中必須帶上 else 分支, 除非編譯器能檢查到你的分支已經(jīng)覆蓋全部情況.
/**
* 演示 when 作為語句使用
*/
@Test fun testWhen() {
val a = 10
when(a) {
1 -> assertTrue(a == 1) // 只有簡(jiǎn)單一個(gè)表達(dá)式可以省略花括號(hào)
3 -> { assertTrue(a == 3) }
5 -> { println("a = $a") }
else -> println("a > 5") // 作為語句時(shí), 可以不寫 else 的.
}
}
/**
* 演示 when 作為表達(dá)式
*/
@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, 達(dá)到范圍檢測(cè)的功能:
@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 循環(huán) range 類型
for 與 range 一起用, 十分方便:
@Test fun testFor() {
for(a in 1..10) { // a 前面不要寫 var
println(a)
}
}
在 kotlin 中, 如果一個(gè)語句塊(使用 {} 包裹的代碼段)里面只有一條語句, 那么 {}
是可以省略不寫的.
@Test fun testForOneExpr() {
// 只有一個(gè)語句, 可以省略花括號(hào)
for(a in 1..10)
println(a)
// 或者寫在同一行
for(a in 11..20) println(a)
}
range 有很多形式, 1..10 這種是最常用的, 還有例如 10 downTo 1, 1..10 step 3
等各種用法, 滿足各種循環(huán)需求
for 循環(huán)數(shù)組類型
有三種形式
- 循環(huán)里面的元素, 不帶索引的
@Test fun testForArrayItem() {
val names = arrayOf("aaa", "bbb", "ccc")
for(name in names)
println(name)
}
- 循環(huán)里面的索引
@Test fun testForArrayIndex() {
val names = arrayOf("aaa", "bbb", "ccc")
// 數(shù)組的 indices 屬性會(huì)返回一個(gè) IntRange
for(index in names.indices)
println(names[index])
}
- 兩個(gè)一起循環(huán)
@Test fun testForArrayIndexItem() {
val names = arrayOf("aaa", "bbb", "ccc")
for((index, item) in names.withIndex())
println("第 ${index + 1} 個(gè)名字是 $item")
}
(index, item) in names.withIndex() 這種語法你可能會(huì)比較陌生, 其實(shí)這是一種解構(gòu)
賦值. withIndex() 返回一個(gè)可迭代的集合, 里面的元素是 IndexedValue<String>
類型, 這是一個(gè)數(shù)據(jù)類, 而數(shù)據(jù)類已經(jīng)默認(rèn)實(shí)現(xiàn)解構(gòu)賦值了.
解構(gòu)賦值的詳細(xì)知識(shí)點(diǎn)以后會(huì)講到.