今天我們一起來(lái)學(xué)習(xí)一下在Kotlin中,if語(yǔ)句、When語(yǔ)句以及Loop循環(huán)語(yǔ)句的使用。
If語(yǔ)句
首先要講的就是If語(yǔ)句的使用,我們先來(lái)看一下If語(yǔ)法,如下:
if (表達(dá)式) { 結(jié)構(gòu)體 } else { 結(jié)構(gòu)體 }
Demo代碼如下:
/**
* if語(yǔ)句 2017/4/5 09:57
* PS: 使用 if 作為表達(dá)式而不是語(yǔ)句(例如:返回它的值或者 把它賦給變量),該表達(dá)式需要有 else 分支。
*/
class TestIf {
/**
* 傳統(tǒng)用法 2017/4/5 09:57
*/
fun if1() {
var isResult = false
if (isResult) {
println("True")
} else {
println("False")
}
}
/**
* 表達(dá)式 2017/4/5 09:58
*/
fun if2() {
var isResult = false
var str = if (isResult) "True" else "False" // 類似于三元運(yùn)算符 2017/4/5 09:59
println(str)
}
/**
* 代碼塊 2017/4/5 10:00
*/
fun if3() {
var isResult = true
var str = if (isResult) {
println("True")
"aaaaa" // 相當(dāng)于返回 2017/4/5 10:07
} else {
println("False")
"bbbbb"
}
println(str)
}
}
官方介紹
在 Kotlin 中,if是一個(gè)表達(dá)式,即它會(huì)返回一個(gè)值。 因此就不需要三元運(yùn)算符(條件 ? 然后 : 否則),因?yàn)槠胀ǖ?if 就能勝任這個(gè)角色。
// 傳統(tǒng)用法
var max = a
if (a < b) max = b
// With else
var max: Int
if (a > b) {
max = a
} else {
max = b
}
// 作為表達(dá)式
val max = if (a > b) a else b
if的分支可以是代碼塊,最后的表達(dá)式作為該塊的值:
val max = if (a > b) {
print("Choose a")
a
} else {
print("Choose b")
b
}
如果你使用 if 作為表達(dá)式而不是語(yǔ)句(例如:返回它的值或者 把它賦給變量),該表達(dá)式需要有 else 分支。
When語(yǔ)句
首先來(lái)看一下語(yǔ)法,如下:
when (表達(dá)式) { 結(jié)構(gòu)體 }
Demo代碼如下:
/**
* When語(yǔ)句,功能類似于Switch 2017/4/5 10:13
*/
class TestWhen {
/**
* 常用1 2017/4/5 10:13
*/
fun when1() {
var value = 1
when(value) {
1 -> println("11111")
2 -> println("22222")
else -> {
println("====else====")
}
}
}
/**
* 常用2 2017/4/5 10:15
* PS: 很多分支需要用相同的方式處理,則可以把多個(gè)分支條件放在一起,用逗號(hào)分隔。
*/
fun when2() {
var value = 1
when(value) {
1, 2 -> println("1111122222")
else -> {
println("====else====")
}
}
}
/**
* 常用3 2017/4/5 10:17
* PS: 任意表達(dá)式(而不只是常量)作為分支條件。
*/
fun when3() {
var value = "1"
when(value) {
("" + 1) -> println("11111")
else -> {
println("====else====")
}
}
}
/**
* 常用4 2017/4/5 10:20
* 用 in 或者 !in 檢測(cè)一個(gè)值是否在該區(qū)間或者集合中。
*/
fun when4() {
var value = 1
var lst = listOf(2, 3)
when(value) {
!in lst -> println("!in list")
in 1..10 -> println("in 1..10")
else -> {
println("====else====")
}
}
}
/**
* 常用5 2017/4/5 10:24
* 用 is 或者 !is 檢測(cè)一個(gè)值的類型。
*/
fun when5() {
var value = 1
var result = when(value) {
is Int -> "Value type is Int."
!is Int -> "Value type not is Int."
else -> {
"====else===="
}
}
println(result)
}
/**
* 常用6 2017/4/5 10:27
* 不提供參數(shù),用來(lái)取代 if-else。
*/
fun when6() {
var isResult = true
when {
isResult -> println("True")
else -> {
println("====else====")
}
}
}
}
官方介紹
when 取代了類 C 語(yǔ)言的 switch 操作符。其最簡(jiǎn)單的形式如下:
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // 注意這個(gè)塊
print("x is neither 1 nor 2")
}
}
when 將它的參數(shù)和所有的分支條件順序比較,直到某個(gè)分支滿足條件。 when 既可以被當(dāng)做表達(dá)式使用也可以被當(dāng)做語(yǔ)句使用。如果它被當(dāng)做表達(dá)式, 符合條件的分支的值就是整個(gè)表達(dá)式的值,如果當(dāng)做語(yǔ)句使用, 則忽略個(gè)別分支的值。(像 if 一樣,每一個(gè)分支可以是一個(gè)代碼塊,它的值 是塊中最后的表達(dá)式的值。)+
如果其他分支都不滿足條件將會(huì)求值 else 分支。 如果 when 作為一個(gè)表達(dá)式使用,則必須有 else 分支, 除非編譯器能夠檢測(cè)出所有的可能情況都已經(jīng)覆蓋了。
如果很多分支需要用相同的方式處理,則可以把多個(gè)分支條件放在一起,用逗號(hào)分隔:
when (x) {
0, 1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}
我們可以用任意表達(dá)式(而不只是常量)作為分支條件:
when (x) {
parseInt(s) -> print("s encodes x")
else -> print("s does not encode x")
}
我們也可以檢測(cè)一個(gè)值在(***in
)或者不在(!in
***)一個(gè)區(qū)間或者集合中:
when (x) {
in 1..10 -> print("x is in the range")
in validNumbers -> print("x is valid")
!in 10..20 -> print("x is outside the range")
else -> print("none of the above")
}
另一種可能性是檢測(cè)一個(gè)值是(***is
)或者不是(!is
***)一個(gè)特定類型的值:
val hasPrefix = when(x) {
is String -> x.startsWith("prefix")
else -> false
}
when 也可以用來(lái)取代 if-else if鏈。 如果不提供參數(shù),所有的分支條件都是簡(jiǎn)單的布爾表達(dá)式,而當(dāng)一個(gè)分支的條件為真時(shí)則執(zhí)行該分支:
when {
x.isOdd() -> print("x is odd")
x.isEven() -> print("x is even")
else -> print("x is funny")
}
Loop循環(huán)語(yǔ)句
循環(huán)語(yǔ)句有3類,for、while、do...while,語(yǔ)法如下:
for (item in 集合) { 結(jié)構(gòu)體 }
while (表達(dá)式) { 結(jié)構(gòu)體 }
do { 結(jié)構(gòu)體 } while (表達(dá)式)
Demo代碼如下:
/**
* 循環(huán)語(yǔ)句 2017/4/5 10:47
*/
class TestLoop {
/**
* 遍歷值 2017/4/5 10:48
*/
fun for1() {
var lst = listOf(1, 2, 3)
for (idx in lst) {
println("idx = " + idx)
}
}
/**
* 遍歷索引 2017/4/5 10:48
*/
fun for2() {
var lst = listOf(3, 4, 5)
for (i in lst.indices) {
println("i = " + i)
}
}
/**
* 遍歷索引/值 2017/4/5 10:50
*/
fun for3() {
var lst = listOf(3, 4, 5)
for ((i, values) in lst.withIndex()) {
println("i = " + i)
println("values = " + values)
}
}
/**
* 常用循環(huán) 2017/4/5 10:52
* PS: 跟java一樣
*/
fun while1() {
var value = 5
while (value > 0) {
println("values = " + value)
value--
}
}
/**
* do-while 2017/4/5 10:54
* PS: 跟java一樣
*/
fun doWhile() {
var value = 5
do {
println("values = " + value)
value--
} while (value > 0)
}
}
官方介紹
while、do...while的使用其實(shí)跟Java是一樣的,這里就不講了。主要看下for語(yǔ)句的使用。
循環(huán)體可以是一個(gè)代碼塊:
for (item: Int in ints) {
// ……
}
如上所述,for 可以循環(huán)遍歷任何提供了迭代器的對(duì)象。即:
有一個(gè)成員函數(shù)或者擴(kuò)展函數(shù) iterator(),它的返回類型
有一個(gè)成員函數(shù)或者擴(kuò)展函數(shù) next(),并且
有一個(gè)成員函數(shù)或者擴(kuò)展函數(shù) hasNext() 返回 Boolean。
這三個(gè)函數(shù)都需要標(biāo)記為 operator。
對(duì)數(shù)組的 for 循環(huán)會(huì)被編譯為并不創(chuàng)建迭代器的基于索引的循環(huán)。
如果你想要通過(guò)索引遍歷一個(gè)數(shù)組或者一個(gè) list,你可以這么做:
for (i in array.indices) {
print(array[i])
}
注意這種“在區(qū)間上遍歷”會(huì)編譯成優(yōu)化的實(shí)現(xiàn)而不會(huì)創(chuàng)建額外對(duì)象。
或者你可以用庫(kù)函數(shù) withIndex:
for ((index, value) in array.withIndex()) {
println("the element at $index is $value")
}
以上對(duì)for、while、do...while的介紹以及使用就講完了。其實(shí)就是在官方給的學(xué)習(xí)資料中進(jìn)行更詳細(xì)的擴(kuò)展,希望能對(duì)學(xué)習(xí)Kotlin的朋友們有所幫助。
謝謝支持~~~