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,另一方面可以分享自己所學的東西,和大家一起交流
