在前面 的章節中講解了Kotlin
語言中的數據類型、變量與常量的定義。不瞭解請參見前面的內容:git
下面詳細爲你們講解Kotlin
中的控制語句使用。不得不說其和Java
中仍是有不少不同的地方。github
在
Kotlin
中的if
語句和Java
仍是仍是有必定的區別的,它能在Java
中更靈活,除了能實現Java
寫法外,還能夠實現表達式(實現三元運算符),及做爲一個塊的運用。編程
一、傳統寫法(同Java
寫法同樣)數組
例:編程語言
var numA = 2
if (numA == 2){
println("numA == $numA => true")
}else{
println("numA == $numA => false")
}
複製代碼
輸出結果爲:函數
numA == 2 => true
複製代碼
二、Kotlin
中的三元運算符post
- 在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")
複製代碼
輸出結果爲:spa
numB = > 3
複製代碼
由上能夠看出,Kotlin
中的if能夠做爲一個表達式並返回一個值。code
三、做爲一個塊結構,而且最後一句表達式爲塊的值
例:
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
複製代碼
Kotlin
廢除了Java
中的for
(初始值;條件;增減步長)這個規則。可是Kotlin
中對於for
循環語句新增了其餘的規則,來知足剛提到的規則。for
循環提供迭代器用來遍歷任何東西for
循環數組被編譯爲一個基於索引的循環,它不會建立一個迭代器對象
一、新增的規則,去知足for
(初始值;條件;增減步長)這個規則
關鍵字:
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
複製代碼
- 關鍵字:
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.三、符號(' .. '
) 表示遞增的循環的另一種操做
- 使用符號(
'..'
).- 範圍:
..[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.四、設置步長
關鍵字:
step
例:
for (i in 10 until 16 step 2){
print("i => $i \t")
}
複製代碼
輸出結果爲:
i => 10 i => 12 i => 14
複製代碼
二、迭代
for
循環提供一個迭代器用來遍歷任何東西。for
循環數組被編譯爲一個基於索引的循環,它不會建立一個迭代器對象
2.一、遍歷字符串
此用法在數據類型章節中的字符串類型中用到過。還不甚清楚的能夠查看 Kotlin——初級篇(三):數據類型詳解。
例:
for (i in "abcdefg"){
print("i => $i \t")
}
複製代碼
輸出結果爲:
i => a i => b i => c i => d i => e i => f i => g
複製代碼
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.三、使用數組的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.四、使用數組的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.五、使用列表或數組的擴展函數遍歷
- 數組或列表有一個成員或擴展函數
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
循環語句經常使用的用法。
- 在
Kotlin
中已經廢除掉了Java
中的switch
語句。而新增了when(exp){}
語句。when
語句不只能夠替代掉switch
語句,並且比switch
語句更增強大
3.一、when語句實現switch語句功能
例:
when(5){
1 -> {
println("1")
}
2 -> println("2")
3 -> println("3")
5 -> {
println("5")
}
else -> {
println("0")
}
}
複製代碼
輸出結果爲:
5
複製代碼
3.二、和逗號結合使用,至關於switch語句中的不使用break跳轉語句
例:
when(1){
// 即x = 1,2,3時都輸出1。
1 , 2 , 3 -> {
println("1")
}
5 -> {
println("5")
}
else -> {
println("0")
}
}
複製代碼
輸出結果爲:
1
複製代碼
3.三、條件可使用任意表達式,不只侷限於常量
至關於
if
表達式的用法。
例:
var num:Int = 5
when(num > 5){
true -> {
println("num > 5")
}
false ->{
println("num < 5")
}
else -> {
println("num = 5")
}
}
複製代碼
輸出結果爲:
num < 5
複製代碼
3.四、 檢查值是否存在於集合或數組中
- 操做符:
(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.五、檢查值是否爲指定類型的值
- 操做符
- 是
(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.六、不使用表達式的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
語句。
- 其同
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 次
複製代碼
- 其同
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 次
複製代碼
其同
Java
中的跳轉語句同樣。在此不作累述。
一、return語句
默認狀況下,從最近的封閉函數或匿名函數返回。
例:
fun returnExample(){
var str: String = ""
if (str.isBlank()){
println("我退出了該方法")
return
}
}
複製代碼
輸出結果爲:
我退出了該方法
複製代碼
二、break語句
做用:終止最近的閉合循環。
例:
var count: Int = 1
for (i in 1 until 10){
if (i == 5){
println("我在第$i 次退出了循環")
break
}
count++
}
println("我循環了多少次:count => $count")
複製代碼
輸出結果爲:
我在第5 次退出了循環
我循環了多少次:count => 5
複製代碼
三、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