Kotlin學習(三)—— 基本型別,包,控制流:if、when、for、while,Break和continue
一.基本型別
Kotlin的數字表現,如下
- Double 64
- Float 32
- Long 64
- Int 32
- Short 16
- Byte 8
這些就是全部的定義數字的方式了,而我們一般的寫法也和JAVA類似
- 十進位制: 10086
- 十六進位制:0x0F
- 二進位制: 0b00001011
- Long型別:10086L
- Float型別:10086f
- Double型別:100.86
同時,Kotlin上有一個下劃線的定義,可以讓程式碼的可讀性更加的強,我們來看下
fun main(args: Array<String>) {
val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010
print("$oneMillion \n")
print("$creditCardNumber \n")
print("$socialSecurityNumber \n")
print("$hexBytes \n")
print("$bytes \n")
}
這段程式碼輸出的數字
下劃線並不像JAVA一樣會影響我們的程式碼,而是讓我們的程式碼可讀性變得更強
並且在JAVA平臺中,== 和 === 的概念 就跟我們JAVA中 == 和eques類似
val a: Int = 10000
// true
print(a === a)
val boxedA: Int? = a
val anotherBoxedA: Int? = a
// false
print(boxedA === anotherBoxedA)
這段程式碼中,我們可以看到,我們定義了一個Inta,又定義了兩個可空Int 賦值 a,結果算出===false,但是如果我們
改成== ,那就是值相等了,===是地址相同,很明顯,我們是兩個不同的變數,所以false
另外,在Kotlin中,小型別也不是大型別的子類,所以不存在強轉的概念
比如這種錯誤的示範
val b: Byte = 1
val i: Int = b
這就隱式轉換,但是我們可以用個顯示轉換來達到我們的需求
val b: Byte = 1
val i: Int = b.toInt()
print(i)
每個數字都是可以通過顯示轉換來達到自己想要的轉換
我們再來看下邏輯運算
- shl(bits) ‒ 有符號左移 (Java 的 << )
- shr(bits) ‒ 有符號右移 (Java 的 >> )
- ushr(bits) ‒ 有符號右移 (Java 的 >>> )
- and(bits) ‒ 位與
- or(bits) ‒ 位或
- xor(bits) ‒ 位異或
- inv() ‒ 位非
我們來寫一段演示的示例
val a: Int = 3
//<< 1
print("${a shl 1} \n")
//>> 1
print("${a shr 1} \n")
//>>> 1
print("${a ushr 1} \n")
//and 1
print("and: ${a.and(5)} \n")
//or 7
print("or : ${a.or(5)} \n")
//xor 6
print("xor : ${a.xor(5)} \n")
//inv -4
print("inv : ${a.inv()} \n")
再來看下Char,Char不能作為一個單獨的字元或數字存在,需要‘’單引號宣告,比如
var a : Char = '1'
我們再來看下如何定義一個數組
//定義items["1","2","3"]
val items = listOf<String>("1","2","3")
//指定大小,內容為空
val itemNulls = arrayOfNulls<Int>(10)
// 建立⼀個 Array<String> 初始化為 ["0", "1", "4", "9", "16"]
//val asc = Array(5, { i -> (i * i).toString() })
// 定義五個數 一直遞增
val asc = Array(5, {i -> (i * i)})
listOf直接宣告,arrayOfNulls宣告一個長度固定的空陣列Array定義一個指定長度,值的陣列
再來看下字串
for (c in "Hello") {
println("$c")
}
這是我們常見的字串,可以包含轉義,還有一種
val text = """
for (c in "foo")
print(c)
"""
這是原生的字串,用三個”“”表示,裡面不包含轉義,是什麼就是什麼,當然,這樣的話裡面就有很多空格了
val text = """
|for (c in "foo")
|print(c)
""".trimMargin()
print(text)
我們可以|聲明當前起始位,並且trimMargin()去除空格,得到的結果
如果你沒有這樣處理的話,你輸出的值是這個樣子的
二.包
包的作用我相信大家都是知道的
package com.liuguilin.kt_package
fun main(args: Array<String>) {
print(sum(1,3))
}
fun sum(a: Int, b: Int): Int {
return a + b;
}
三.控制流:if、when、for、while
1.if表示式
在kotlin中,if的用法不侷限於判斷,他還會有返回,所以我們的寫法也很多,比如
val a = 12;
//傳統
if (a > 10) {
print(">")
} else {
print("<")
}
//表示式
if (a > 10) print(">") else print("<")
//表示式
var b = if (a > 10) 10 else 20
2.When表示式
val today = 4;
when (today) {
1 -> print("春季")
2 -> print("春季")
3 -> print("春季")
4 -> print("夏季")
5 -> print("夏季")
6 -> print("夏季")
7 -> print("秋季")
8 -> print("秋季")
9 -> print("秋季")
10 -> print("冬季")
11 -> print("冬季")
12 -> print("冬季")
}
但是我們一般是需要else結尾的,而且我們可以用in來表達
val today = 4;
when (today) {
in 1..3 -> print("春季")
in 4..6 -> print("夏季")
in 7..9 -> print("秋季")
in 10..12 -> print("冬季")
else -> print("error")
}
當然,你還可以用is來判斷型別,這裡就不講了
3.For 迴圈
var items = listOf(1,2,3);
//out 123
for(a in items) print(a)
//out 012
for (a in items.indices) print(a)
//out 0 , 1 1 , 2 2 , 3
for ((a,b)in items.withIndex()) print("$a , $b \n")
4.While 迴圈
var a = 5;
while (a > 3){
print(a)
a--;
}
do {
print(a)
a--;
}while (a > 3)
四.Break和continue
Kotlin 有三種結構化跳轉表示式:
- return。預設從最直接包圍它的函式或者匿名函式返回。
- break。終止最直接包圍它的迴圈。
- continue。繼續下一次最直接包圍它的迴圈。
我們來看一個例子
var items = listOf(1, 3, 5, 7, 9)
for (a in items) {
if (a == 5) {
continue | break | return
}
print("$a \n")
}
這裡迴圈一個數組,如果等於5就分別執行continue,break,return,如果是break,return會跳出迴圈,也就
只會列印1,3而continue會跳出本次迴圈,也就會列印1,3,7,9