在前面 的章節中講解了Kotlin
語言中的資料型別、變數與常量的定義。不瞭解請參見前面的內容:
下面詳細為大家講解Kotlin
中的控制語句使用。不得不說其和Java
中還是有很多不一樣的地方。
目錄
一、if語句
在
Kotlin
中的if
語句和Java
還是還是有一定的區別的,它能在Java
中更靈活,除了能實現Java
寫法外,還可以實現表示式(實現三元運算子),及作為一個塊的運用。
1、傳統寫法(同Java
寫法一樣)
例:
var numA = 2
if (numA == 2){
println("numA == $numA => true")
}else{
println("numA == $numA => false")
}
複製程式碼
輸出結果為:
numA == 2 => true
複製程式碼
2、Kotlin
中的三元運算子
- 在Kotlin中其實是不存在三元運算子(
condition ? then : else
)這種操作的。- 那是因為if語句的特性(
if
表示式會返回一個值)故而不需要三元運算子。
例:
// 在Java中可以這麼寫,但是Kotlin中直接會報錯。
// var numB: Int = (numA > 2) ? 3 : 5
// kotlin中直接用if..else替代。例:
var numB: Int = if ( numA > 2 ) 3 else 5 // 當numA大於2時輸出numB的值為3,反之為5
println("numB = > $numB")
複製程式碼
輸出結果為:
numB = > 3
複製程式碼
由上可以看出,Kotlin
中的if可以作為一個表示式並返回一個值。
3、作為一個塊結構,並且最後一句表示式為塊的值
例:
var numA: Int = 2
var numC: Int = if (numA > 2){
numA++
numA = 10
println("numA > 2 => true")
numA
}else if (numA == 2){
numA++
numA = 20
println("numA == 2 => true")
numA
}else{
numA++
numA = 30
println("numA < 2 => true")
numA
}
// 根據上面的程式碼可以看出,每一個if分支裡面都是一個程式碼塊,並且返回了一個值。根據條件numC的值應該為20
println("numC => $numC")
複製程式碼
輸出結果為:
numA == 2 => true
numC => 20
複製程式碼
二、for語句
Kotlin
廢除了Java
中的for
(初始值;條件;增減步長)這個規則。但是Kotlin
中對於for
迴圈語句新增了其他的規則,來滿足剛提到的規則。for
迴圈提供迭代器用來遍歷任何東西for
迴圈陣列被編譯為一個基於索引的迴圈,它不會建立一個迭代器物件
1、新增的規則,去滿足for
(初始值;條件;增減步長)這個規則
- 1.1、遞增
關鍵字:
until
範圍:until[n,m)
=> 即大於等於n,小於m
例:
// 迴圈5次,且步長為1的遞增
for (i in 0 until 5){
print("i => $i \t")
}
複製程式碼
輸出結果為
i => 0 i => 1 i => 2 i => 3 i => 4
複製程式碼
- 1.2、遞減
- 關鍵字:
downTo
- 範圍:
downTo[n,m]
=> 即小於等於n,大於等於m ,n > m
例:
// 迴圈5次,且步長為1的遞減
for (i in 15 downTo 11){
print("i => $i \t")
}
複製程式碼
輸出結果為:
i => 15 i => 14 i => 13 i => 12 i => 11
複製程式碼
1.3、符號(' .. '
) 表示遞增的迴圈的另外一種操作
- 使用符號(
'..'
).- 範圍:
..[n,m]
=> 即大於等於n,小於等於m
- 和
until
的區別,一是簡便性。二是範圍的不同。
例:
print("使用 符號`..`的列印結果\n")
for (i in 20 .. 25){
print("i => $i \t")
}
println()
print("使用until的列印結果\n")
for (i in 20 until 25){
print("i => $i \t")
}
複製程式碼
輸出結果為:
使用 符號`..`的列印結果
i => 20 i => 21 i => 22 i => 23 i => 24 i => 25
使用until的列印結果
i => 20 i => 21 i => 22 i => 23 i => 24
複製程式碼
1.4、設定步長
關鍵字:
step
例:
for (i in 10 until 16 step 2){
print("i => $i \t")
}
複製程式碼
輸出結果為:
i => 10 i => 12 i => 14
複製程式碼
2、迭代
for
迴圈提供一個迭代器用來遍歷任何東西。for
迴圈陣列被編譯為一個基於索引的迴圈,它不會建立一個迭代器物件
2.1、遍歷字串
此用法在資料型別章節中的字串型別中用到過。還不甚清楚的可以檢視 Kotlin——初級篇(三):資料型別詳解。
例:
for (i in "abcdefg"){
print("i => $i \t")
}
複製程式碼
輸出結果為:
i => a i => b i => c i => d i => e i => f i => g
複製程式碼
2.2、遍歷陣列
此用法在資料型別章節中的陣列型別中用到過。還不甚清楚的可以檢視 Kotlin——初級篇(三):資料型別詳解。
例:
var arrayListOne = arrayOf(10,20,30,40,50)
for (i in arrayListOne){
print("i => $i \t")
}
複製程式碼
輸出結果為:
i => 10 i => 20 i => 30 i => 40 i => 50
複製程式碼
2.3、使用陣列的indices
屬性遍歷
例:
var arrayListTwo = arrayOf(1,3,5,7,9)
for (i in arrayListTwo.indices){
println("arrayListTwo[$i] => " + arrayListTwo[i])
}
複製程式碼
輸出結果為:
arrayListTwo[0] => 1
arrayListTwo[1] => 3
arrayListTwo[2] => 5
arrayListTwo[3] => 7
arrayListTwo[4] => 9
複製程式碼
2.4、使用陣列的withIndex()
方法遍歷
例:
var arrayListTwo = arrayOf(1,3,5,7,9)
for ((index,value) in arrayListTwo.withIndex()){
println("index => $index \t value => $value")
}
複製程式碼
輸出結果為:
index => 0 value => 1
index => 1 value => 3
index => 2 value => 5
index => 3 value => 7
index => 4 value => 9
複製程式碼
2.5、使用列表或陣列的擴充套件函式遍歷
- 陣列或列表有一個成員或擴充套件函式
iterator()
實現了Iterator<T>
介面,且該介面提供了next()
與hasNext()
兩個成員或擴充套件函式- 其一般和
while
迴圈一起使用
-
可以檢視
Array.kt
這個類。可以看見其中的iterator()
函式,而這個函式實現了Iterator
介面。/** * Creates an iterator for iterating over the elements of the array. */ public operator fun iterator(): Iterator<T> 複製程式碼
-
檢視
Iterator.kt
這個介面類,這個介面提供了hasNext()
函式和next()
函式。public interface Iterator<out T> { /** * Returns the next element in the iteration. */ public operator fun next(): T /** * Returns `true` if the iteration has more elements. */ public operator fun hasNext(): Boolean } 複製程式碼
例:
var arrayListThree = arrayOf(2,'a',3,false,9)
var iterator: Iterator<Any> = arrayListThree.iterator()
while (iterator.hasNext()){
println(iterator.next())
}
複製程式碼
輸出結果為:
2
a
3
false
9
複製程式碼
終上所述就是for
迴圈語句常用的用法。
三、when語句
- 在
Kotlin
中已經廢除掉了Java
中的switch
語句。而新增了when(exp){}
語句。when
語句不僅可以替代掉switch
語句,而且比switch
語句更加強大
3.1、when語句實現switch語句功能
例:
when(5){
1 -> {
println("1")
}
2 -> println("2")
3 -> println("3")
5 -> {
println("5")
}
else -> {
println("0")
}
}
複製程式碼
輸出結果為:
5
複製程式碼
3.2、和逗號結合使用,相當於switch語句中的不使用break跳轉語句
例:
when(1){
// 即x = 1,2,3時都輸出1。
1 , 2 , 3 -> {
println("1")
}
5 -> {
println("5")
}
else -> {
println("0")
}
}
複製程式碼
輸出結果為:
1
複製程式碼
3.3、條件可以使用任意表示式,不僅侷限於常量
相當於
if
表示式的用法。
例:
var num:Int = 5
when(num > 5){
true -> {
println("num > 5")
}
false ->{
println("num < 5")
}
else -> {
println("num = 5")
}
}
複製程式碼
輸出結果為:
num < 5
複製程式碼
3.4、 檢查值是否存在於集合或陣列中
- 操作符:
(in)
在(!in)
不在- 限定:只適用於數值型別
例:
var arrayList = arrayOf(1,2,3,4,5)
when(1){
in arrayList.toIntArray() -> {
println("1 存在於 arrayList陣列中")
}
in 0 .. 10 -> println("1 屬於於 0~10 中")
!in 5 .. 10 -> println("1 不屬於 5~10 中")
else -> {
println("都錯了 哈哈!")
}
}
複製程式碼
輸出結果為:
元素`1`存在於 arrayList陣列中
複製程式碼
其中,符號( .. )
表示至
的意思。如例子中的0 .. 10
就表示0至10
或者0到10
。
3.5、檢查值是否為指定型別的值
- 操作符
- 是
(is)
- 不是
(!is)
- 值得注意的是,
Kotlin
的智慧轉換可以訪問型別的方法和屬性
例:
when("abc"){
is String -> println("abc是一個字串")
else -> {
println("abc不是一個字串")
}
}
// 智慧轉換
var a: Int = 2
when(a){
!is Int -> {
println("$a 不是一個Int型別的值")
}
else -> {
a = a.shl(2)
println("a => $a")
}
}
複製程式碼
輸出結果為:
abc是一個字串
a => 8
複製程式碼
3.6、不使用表示式的when語句
表示為最簡單的布林表示式
例:
var array = arrayOfNulls<String>(3)
when{
true -> {
for (i in array){
print(" $i \t")
}
println()
}
else -> {
}
}
複製程式碼
輸出結果為:
null null null
複製程式碼
綜上所述,為Kotlin
中when
控制語句的常見用法。可以看出它的強大。以及便利性。不僅可以替代掉Java
語句中的swicth
語句。甚至可以替換掉if
語句。
四、while語句
- 其同
Java
中的while
迴圈一樣。在此不做累述。- 定義格式:
while(exp){ 其中exp為表示式
...
}
複製程式碼
例:
var num = 5
var count = 1
while (num < 10){
println("num => $num")
println("迴圈了$count 次")
count++
num++
}
複製程式碼
輸出結果為:
num => 5
迴圈了1 次
num => 6
迴圈了2 次
num => 7
迴圈了3 次
num => 8
迴圈了4 次
num => 9
迴圈了5 次
複製程式碼
五、do...while語句
- 其同
Java
中的do...while
迴圈一樣。在此不做累述。- 定義格式:
do(exp){ // 其中exp為表示式
...
}(while)
複製程式碼
例:
var num = 5
var count = 1
do {
println("num => $num")
println("迴圈了$count 次")
count++
num++
}while (num < 10)
複製程式碼
輸出結果為:
num => 5
迴圈了1 次
num => 6
迴圈了2 次
num => 7
迴圈了3 次
num => 8
迴圈了4 次
num => 9
迴圈了5 次
複製程式碼
PS:
do{...}while(exp)與while(exp){...}
最大的區別是do{...}while(exp)
最少執行一次,這點也是和Java
相同的
例:
var num = 5
var count = 1
do {
println("num => $num")
println("迴圈了$count 次")
count++
num++
}while (num < 5)
複製程式碼
輸出結果為:
num => 5
迴圈了1 次
複製程式碼
六、跳轉語句(return、break、continue)
其同
Java
中的跳轉語句一樣。在此不做累述。
1、return語句
預設情況下,從最近的封閉函式或匿名函式返回。
例:
fun returnExample(){
var str: String = ""
if (str.isBlank()){
println("我退出了該方法")
return
}
}
複製程式碼
輸出結果為:
我退出了該方法
複製程式碼
2、break語句
作用:終止最近的閉合迴圈。
例:
var count: Int = 1
for (i in 1 until 10){
if (i == 5){
println("我在第$i 次退出了迴圈")
break
}
count++
}
println("我迴圈了多少次:count => $count")
複製程式碼
輸出結果為:
我在第5 次退出了迴圈
我迴圈了多少次:count => 5
複製程式碼
3、continue語句
前進到最近的封閉迴圈的下一個步驟(迭代)。
例:
for (i in 1 until 10){
if (i == 5){
println("我跳過了第$i 次迴圈")
continue
}
println("i => $i")
}
複製程式碼
輸出結果為:
i => 1
i => 2
i => 3
i => 4
我跳過了第5 次迴圈
i => 6
i => 7
i => 8
i => 9
複製程式碼
七、總結
不管對於任何一門程式語言,都有最基本的條件邏輯控制語句,而其語句是學習一門程式語言的基礎。所以請各位大佬認真並且跟著程式碼敲一遍。特別是for
語句和when
語句這兩個點。因為這兩個點都和Java
語言很大的改動。當然,if
語句中的三元運算子也是值得注意的
原始碼
如果各位大佬看了之後感覺還闊以,就請各位大佬隨便star一下,您的關注是我最大的動力。
我的個人部落格:Jetictors
Github:Jteictors