1.定義變量
在kotlin中,通過var 或者 val 來定義,區別就是 val定義的變量只能讀不能修改,var則可以修改。
val a:Int = 1 //等價於java: final int i = 10; a = 2 // 錯誤,變量a是只讀 var b:Int = 2 b = 15 // ok
kotlin中定義的變量的格式
[變量名]:[變量類型]
另一方面,kotkin中的整形既不是用int或Integer,而是使用Int,這里簡單介紹一下kotlin中的基本類型:數字、字符、Boolean、數組和字符串
kotlin關鍵字 | 對應java關鍵字 | 說明 |
---|---|---|
Double | Double | 64位 |
Float | Float | 32位 |
Long | Long | 64位 |
Int | Integer | 32位 |
Short | Short | 16位 |
Byte | Byte | 8位 |
Arrya | Object[] | |
Boolean | Boolean | |
String | String | |
Any | Object | kotlin中使用Any來達到java中Object的作用 |
看來除了Int類型,其他的好像也和java中的差不多。這里只是簡單與java中對比介紹一下,后面會專門介紹這些基本類型與java中的異同。
變量類型可以省略
對於在定義的時候同時初始化的變量,可以省略變量類型,kotlin會根據初始化的值進行變量類型推斷
val a = 1 // a是Int類型,Long在則在后面加上L,如 10L val b = 1.2 // b是Double類型,Float在后面加上f/F,如1.2f val c = "test" // c是String類型
2.定義方法(function)
fun sum(a: Int, b: Int): Int { return a + b } fun myPrint(a: Int) { print(a) } fun main(args: Array<String>) { print("sum of 3 and 5 is ") println(sum(3, 5)) }
注意的是
- kotlin中任何東西都是對象,包括方法,所以方法的定義和變量類似
[方法定義]:[返回類型]{方法體}
- 如果沒有返回,則可以省略返回類型(或者使用Unit)
- 參數傳遞過來的變量是只讀的(val修飾)
fun someCall(a:Int){ a = 2 //error }
3.null檢查
在kotlin中,默認定義一個變量是不能為null
var a:Int = null //compile error var a:Int = someCallReturnNull() // runtiem excetion:KotlinNullPointerException
那如果允許空,則需要在變量類型后加上'?'例如
var a:Int? = null
方法的類似,如果定義方法
fun someCall(): Int { return null //compile error }
因為返回的類型為Int,是不允許為空的,如果要返回空怎么辦呢,一樣加上'?'
fun someCallWillReturnNull(): Int? { return null //ok }
如果我們定義了不能為空的類型,去接受可能返回空的函數怎么辦,這個使用要用到另外一個符號'!!'
var a:Int = someCallWillReturnNull() //compile error var b:Int = someCallWillReturnNull()!! //變量也是同理 var c:Int? = null var d:Int = c!! //當然這里肯定會跑出NPE,至少在編譯到時候不會報錯
其實可以簡單理解,使用!!修飾的變量,如果為null就會跑出NPE.例如a!! 可以理解
if(a==null){ throw new NullPointExcetion(); }
空檢測是kotlin的一個特點,他規定如果某些方法會返回null則在處理這些返回時需要注意,否則認為是null安全的(即不用檢測null)
4.字符串模板
如果要在java中找個對應功能,可能就是String.format(),但是kotlin中的字符串模板更強大一點
var a = 1 // 簡單的變量替換 val s1 = "a is $a" a = 2 // 在字符串模板中使用一些字符串方法 val s2 = "${s1.replace("is", "was")}, but now is $a"
5.條件表達式
if表達式
常規的用法和java中類似
fun max(a: Int, b: Int):Int{ var max: Int if (a > b) { max = a } else { max = b } return max }
但是kotlin提供的一些語法糖,例如上面max等於a和b中的最大者,可以這樣寫
val max =if (a > b) { a} else { b }
注:kotlin總沒有 ? : 三元運算符
進一步,如果方法返回a和b中的最大者
fun max(a: Int, b: Int) = if (a > b) {a} else {b}
可見變量和方法其實有很共性的(其實對於kotlin都是對象)
when表達式
取代java中switch,
when(x){ 1 -> someCall1(x) 2,3 -> someCall2(x) else -> someCall3(x) }
6. 類型檢查和轉換
在java中,我們常常強轉一個類型會這么寫
if(obj instance MyObj){ MyObj myObj = (MyObj)obj; myObj.someCall() }
是不是感覺很冗余,kotlin抓住了這個痛點
if(obj is MyObj){ obj.someCall() //已經轉換位MyObj類型 }
或者也可以這樣
if(obj !is MyObj){ //do something } obj.someCall() //已經轉換位MyObj類型
7.數字序列
kotlin中提供遍歷一組數字序列,例如 1到100 可以表示為 1..100
for (i in 1..100) { ... }
8.集合操作
遍歷
for (item in items) { println(item) }
kotlin遍歷list或者map十分方便
//遍歷list val items = listOf("apple", "banana", "kiwi") for (item in items) { println(item) } //遍歷map for ((k, v) in map) { println("$k -> $v") }
檢查某個對象是否在集合中
when { "orange" in items -> println("juicy") "apple" in items -> println("apple is fine too") }
使用lambda進行集合操作
這個有點類似java8中的stream
lists .filter { it.startsWith("a") } .sortedBy { it } .map { it.toUpperCase() } .forEach { println(it) }
注:如果lambda的參數一個,可以省略,並且使用it來代替
小結
本人也是剛開始學習kotlin,上面只是對kotlin的一些基礎用法進行簡要介紹,大多參考官方文檔。kotlin的還有很多高階用法,后面還會繼續些文章介紹,一方面可以自己學習kotlin,另一方面可以分享自己所學的東西,和大家一起交流