這篇主要記一下 Kotlin 中的分支(條件判斷)、循環以及經常使用的一些關鍵字。html
if-elsejava
if-else 結構的用法大致上和 Java 一致,好比:數組
fun main() {
val score = 50
if (score < 0) {
println("分數不符合,應該爲非負數")
} else if (score < 60) {
println("不及格")
} else if (score < 80) {
println("及格")
} else if (score < 90) {
println("良好")
} else if (score < 101) {
println("優秀")
} else {
println("分數不符合,最大爲100")
}
}
複製代碼
同時 if-else
結構能夠做爲表達式,做用相似於 Java 中的 ?:
。bash
// 當知足if中的條件時c的值是a,不然c的值是b
val c = if(condition) a else b
複製代碼
whenapp
Kotlin 中用 when
關鍵字代替了 Java 中的 switch
,但用法相似。when 中,else
類比於 switch 中的 default
,當其餘分支不匹配時走 else。若是不少分支須要用相同的方式處理,則能夠把多個分支條件放在一塊兒,用 ,
分隔。oop
fun main() {
val x = 'd'
when(x){
'a' -> println("x = a")
'b' -> println("x = b")
'C','c' -> println("x = C or c")
else -> println("x is others")
}
}
// 運行結果
x is others
複製代碼
Kotlin 中至關於默認加上 break,由上往下依次對照case,若是符合條件,則執行對應的語句,以後的分支不會繼續走。ui
fun main() {
val x = 5
when (x) {
in 1..10 -> print("x is in 1 to 10")
!in 10..20 -> print("x is not in 10 to 20")
else -> print("none of the above")
}
}
// 運行結果
x is in 1 to 10
複製代碼
能夠看到,x 雖然同時知足 in 1..10
和 !in 10..20
兩個條件,可是隻會走第一條分支。spa
同時,和 if-else 結構同樣,when 也能夠做爲表達式,若是做爲表達式,最早
符合條件的分支的值就是整個表達式的值。code
fun main() {
val x = 5
val c = when (x) {
0 -> "x = 0"
1 -> "x = 1"
else -> "x = else"
}
println(c)
}
//運行結果
x = else
複製代碼
when 能夠用來取代 if-else if
鏈,若是不提供參數,全部的分支條件都是簡單的布爾表達式,而當一個分支的條件爲真時則執行該分支:htm
以前 if-else 結構的例子能夠用 when 來改寫:
fun main() {
val score = 50
when{
score < 0 -> println("分數不符合,應該爲非負數")
score < 60 -> println("不及格")
score < 80 -> println("及格")
score < 90 -> println("良好")
score < 101 -> println("優秀")
else -> println("分數不符合,最大爲100")
}
}
//運行結果
不及格
複製代碼
Kotlin 中,for
循環能夠對任何提供迭代器的對象進行遍歷。一般使用 in
關鍵字表示在某一個區間或某一集合中。
fun main() {
val arr = arrayOf("one", "two", "three")
for (a in arr){
println(a)
}
}
// 運行結果
one
two
three
複製代碼
能夠看到,表示當前元素的變量 a,不用顯式申明類型
若是想經過索引(下標)遍歷一個數組或 list 時,可使用 indices
變量來得到索引:
fun main() {
val array = arrayOf("one", "two", "three")
for (i in array.indices){
println(array[i])
}
}
複製代碼
或者使用 withIndex()
方法,同時得到下標和值。
fun main(){
val array = arrayOf("apple", "banana", "orange")
for ((index, value) in array.withIndex()) {
println("the element at $index is $value")
}
}
//輸出結果
the element at 0 is apple
the element at 1 is banana
the element at 2 is orange
複製代碼
Kotlin 中的 while
和 do-while
的用法和 Java 中同樣,看兩個例子理解一下。
fun main() {
var i = 0
while(i < 5){
print("$i ")
i++
}
}
//運行結果
0 1 2 3 4
fun main() {
var i = 0
do {
print("$i ")
i++
}while (i < 5)
}
//運行結果
0 1 2 3 4
複製代碼
在分支和循環部分,提到了一些關鍵字或符號,但沒有專門解釋過。這部分就來說講一些經常使用的關鍵字。
in
:表示在一個區間或集合內(數組、list、set 等)
!in
:和 in 正好相反,表示不在該範圍中
a..b
:表示閉區間 [a,b],其中 a <= b
until
:a until b 表示左閉右開區間 [a,b),其中 a <= b
fun main() {
for (i in 1..10) {
print("$i ")
}
}
//運行結果
1 2 3 4 5 6 7 8 9 10
複製代碼
fun main() {
for (i in 1 until 10){
print("$i ")
}
}
//運行結果
1 2 3 4 5 6 7 8 9
複製代碼
step
:步長,循環時的間隔
fun main() {
for (i in 1 until 10 step 2){
print("$i ")
}
}
//運行結果
1 3 5 7 9
複製代碼
downTo:a downTo b 表示從大到小遞減的閉區間 [a, b],a >= b
fun main() {
for (i in 10 downTo 2 step 2){
print("$i ")
}
}
//運行結果
10 8 6 4 2
複製代碼
is
:是不是某一個類型,相似於 Java 中的 instanceof
關鍵字
而且 Kotlin 中會進行智能類型轉換,若是是某一個類型,就會自動轉換成該類型,不用顯式類型轉換。
舉個例子:
實現一個將字符串轉化爲大寫,可是參數是Object(Kotlin 中爲 Any)類型,不能直接調用方法,須要先進行類型判斷。Java 中的實現:
public class TestJava {
public static void stringToUpperCase(Object o){
if(o instanceof String){
System.out.println(((String) o).toUpperCase());
} else {
System.out.println("不是String類型");
}
}
public static void main(String[] args) {
stringToUpperCase("hello");
stringToUpperCase(1);
}
}
//運行結果
HELLO
不是String類型
複製代碼
Kotin 的實現:
fun stringToUpperCase(o : Any){
if(o is String){
println(o.toUpperCase())
}else{
println("不是String類型")
}
}
fun main() {
stringToUpperCase("hello")
stringToUpperCase(1)
}
//運行結果
HELLO
不是String類型
複製代碼
二者的不一樣的在於 Java 在是 String 類型時,要使用 ((String) o)
進行強制類型轉換,而 Kotlin 已經直接幫咱們轉換了,寫起來更加簡潔。
關於 Kotlin 中分支、循環、經常使用關鍵字就先寫到這裏,下一篇將介紹 Kotlin 中的類與對象。