回到目錄
項(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á)式用, 必須寫(xiě)成完整
的 if else
語(yǔ)句.
@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
也是沒(méi)問(wèn)題的.
@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)語(yǔ)法, 比如 1..10
表示 IntRange 類(lèi)
型. 是數(shù)學(xué)中封閉的 [1, 10]
區(qū)間內(nèi)所有整數(shù)的概念. 還有 CharRange
, LongRange
.
when
形式上比較像 java 的 switch
, 但是 Kotlin 中的 when
十分牛逼.
跟 if
一樣, 可以當(dāng)成語(yǔ)句使用, 也可以當(dāng)成一個(gè)表達(dá)式, 如果作為表達(dá)式,
when
中必須帶上 else
分支, 除非編譯器能檢查到你的分支已經(jīng)覆蓋全部情況.
/**
* 演示 when 作為語(yǔ)句使用
*/
@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") // 作為語(yǔ)句時(shí), 可以不寫(xiě) 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 類(lèi)型
for
與 range
一起用, 十分方便:
@Test fun testFor() {
for(a in 1..10) { // a 前面不要寫(xiě) var
println(a)
}
}
在 kotlin 中, 如果一個(gè)語(yǔ)句塊(使用 {}
包裹的代碼段)里面只有一條語(yǔ)句, 那么 {}
是可以省略不寫(xiě)的.
@Test fun testForOneExpr() {
// 只有一個(gè)語(yǔ)句, 可以省略花括號(hào)
for(a in 1..10)
println(a)
// 或者寫(xiě)在同一行
for(a in 11..20) println(a)
}
range 有很多形式, 1..10
這種是最常用的, 還有例如 10 downTo 1
, 1..10 step 3
等各種用法, 滿(mǎn)足各種循環(huán)需求
for
循環(huán)數(shù)組類(lèi)型
有三種形式
- 循環(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()
這種語(yǔ)法你可能會(huì)比較陌生, 其實(shí)這是一種解構(gòu)
賦值. withIndex()
返回一個(gè)可迭代的集合, 里面的元素是 IndexedValue<String>
類(lèi)型, 這是一個(gè)數(shù)據(jù)類(lèi), 而數(shù)據(jù)類(lèi)已經(jīng)默認(rèn)實(shí)現(xiàn)解構(gòu)賦值了.
解構(gòu)賦值的詳細(xì)知識(shí)點(diǎn)以后會(huì)講到.