Kotlin在今年5月份獲得了Android官方的支持德崭,被指定為Android開發(fā)一級語言,一個月之內(nèi)進(jìn)入了編程語言排行榜的前50(艾猜。而Android Studio也有插件支持Kotlin脓杉,Kotlin可以和Java混合使用,AS中支持直接將Java和Kotlin代碼互相轉(zhuǎn)換黔攒,相對來講Kotlin代碼比Java簡潔一些
變量、常量强缘、方法
Kotlin 的基本數(shù)值類型包括 Byte督惰、Short、Int旅掂、Long赏胚、Float、Double 等商虐,注意哦觉阅!這里是Int不是Integer,而且字符在Kotlin中屬于一個特殊的數(shù)據(jù)類型。在Kotlin中聲明變量的方式和Java也有一定的差別如下
Kotlin定義常量和變量
var name: String = "李四"http://變量秘车,可以多次賦值
val age: Int = 24//常量
val sex="男"http://支持類型自動檢測
在Kotlin中變量和常量通過var和val區(qū)分典勇,而且Kotlin沒有分號的,沒有分號的叮趴,沒有分號的,(真不是在湊字?jǐn)?shù)...)割笙,上面說到變量name
不可為空,因為Kotlin中變量可空需要在后面加?
如
var name: String ? = "李四"http://
這也就是Kotlin中防止空指針的方法眯亦,?
的作用類似Java中的裝箱吧(不明白裝箱的自行解決)咳蔚。
Kotlin中定義方法(靜態(tài)方法)
fun test(a: Int): Unit {
//方法用fun修飾,括號中內(nèi)容為參數(shù)類型搔驼,多個參數(shù)用逗號隔開,Unit為參數(shù)類型 類似void 可以省略
}
//Kotlin中靜態(tài)方法采用companion包裹
companion object {
fun getName() {
}
fun getStatic(string: String): String? {
return null
}
}
Kotlin中定義類(靜態(tài)類)
Kotlin中類的定義和Java差不多侈询,不過從上面定義靜態(tài)方法應(yīng)該知道Kotlin中有關(guān)靜態(tài)的定義和Java也是有差異的舌涨,Kotlin中靜態(tài)類定義如下
object Demo {
......
//在Kotlin中靜態(tài)類中的所有方法均為靜態(tài)方法,而在其他類中調(diào)用靜態(tài)類中的方法不能直接通過
//`類名.方法名()`調(diào)用,調(diào)用格式如下 `類名.INSTANCE.方法名()`
}
數(shù)據(jù)之間的比較
在Kotlin中通過==
來判斷值是否相等囊嘉,通過===
判斷內(nèi)存地址是否相等温技,下面走進(jìn)第一個坑...
方法一
fun office() {
val a: Int = 10000//127
val boxedA: Int = a
val anotherBoxedA: Int = a
Log.e(Tag, (boxedA === anotherBoxedA).toString())//true
Log.e(Tag, (boxedA==anotherBoxedA).toString())//true
}
這里定義了3個常量,且這3個常量不可為空扭粱,(就好比int類型不可以為空),boxedA
和anotherBoxedA
值與內(nèi)存地址均相等說明這2個變量是對同一個內(nèi)存地址的引用
方法二
fun office() {
val a: Int? = 10000//127
val boxedA: Int? = a
val anotherBoxedA: Int? = a
Log.e(Tag, (boxedA === anotherBoxedA).toString())//true
Log.e(Tag, (boxedA == anotherBoxedA).toString())//true
}
這里定義了3個可為空的常量(Integer對象可以為空這個能理解吧)舵鳞,boxedA
和anotherBoxedA
值與內(nèi)存地址均相等說明這2個變量是對同一個內(nèi)存地址的引用,
方法三
fun office() {
val a: Int = 10000//127
val boxedA: Int? = a
val anotherBoxedA: Int? = a
Log.e(Tag, (boxedA === anotherBoxedA).toString())//-128-127為true其余為false
Log.e(Tag, (boxedA == anotherBoxedA).toString())//true
}
這里一開始我是不明白的boxedA
和anotherBoxedA
的內(nèi)存地址是否相等根據(jù)a
的值來確定琢蛤,查了一下比較合理的解釋就是JVM把[-128,127]的所有int數(shù)字全部緩存了蜓堕,任何指向這個范圍的對象,都不可能被另外"創(chuàng)建"博其,自然不能“裝箱”
官方文檔是不太合理的套才,它只給了1000這個數(shù)。
數(shù)據(jù)之間的轉(zhuǎn)換
Kotlin中不能像Java一樣將一個小的數(shù)據(jù)類型賦值給大的數(shù)據(jù)慕淡,精度也一樣
val b: Byte = 1 // Kotlin中數(shù)據(jù)類型支持自動檢測哦
val i: Int = b // 錯誤
val z:Int=b.toInt()//正確
val c : Float = 1.123F
val d: Double = c//錯誤
val d: Double = c.toDouble()//正確
字符串操作
Kotlin中字符串的操作處理得還是很好的不用斷斷續(xù)續(xù)的去用加號和雙引號連接背伴,$表示一個變量或者變量值
fun stringStitch(){
val mils = 100
val sentenceOne = "if you miss the train i on"
//字符串和其他類型的的數(shù)據(jù)加$號直接拼接 $mils表示常量的值而非一個字符串
val sentenceTwo = "hundred mils or $mils mils"
Log.e(Tag, sentenceTwo)//打印hundred mils or 100 mils
//replace直接查找替換字符串中對應(yīng)的內(nèi)容
sentenceOne.replace("train", "bus")
Log.e(Tag, sentenceOne)//打印if you miss the train i on
//額 算是多段拼接吧 字符串中的表達(dá)式通過${...}表示
Log.e(Tag, "sentenceOne is $sentenceOne ,but now sentenceOne is ${sentenceOne.replace("train", "bus")}")
//打印sentenceOne is if you miss the train i on ,but now sentenceOne is if you miss the bus i on
}
區(qū)間
和Java不同,Kotlin中舍棄了Java中for(變量初始化;循環(huán)條件;迭代語句)
的結(jié)構(gòu)峰髓,所以在這里先說一下區(qū)間的表示方式傻寂,Kotlin中可以用a..b
表示某一個升序的區(qū)間,如果需要表示一個降序的區(qū)間采用a downTo b
携兵,此外Kotlin中區(qū)間中的數(shù)據(jù)還支持指定步長 a..b step
疾掰,區(qū)間的開閉采用util
表示
fun range() {
for (key in 1..9) {
//打印1-9
}
for (key in 1..9 step 3) {
//打印1-4-7 步長為3
}
for (key in 1 until 9) {
//依然表示區(qū)間,包含開頭不包含結(jié)尾眉孩,一個左閉右開的區(qū)間
}
for (key in 9 downTo 1) {
//Kotlin默認(rèn)只支持升序
}
}
數(shù)組
數(shù)組的創(chuàng)建方式包括以下兩種个绍,前面講過Kotlin中不支持?jǐn)?shù)據(jù)類型的直接轉(zhuǎn)換,所以在Kotlin中數(shù)組是不可型變的浪汪,
fun aboutArray() {
val arrayA: Array<Int> = arrayOf(1, 2, 3)//[1,2,3]
val arrayB = Array(3, { i -> (i + 10) * 2 })//params_one->數(shù)組長度 params_two->表達(dá)式{}為空則數(shù)組為空 默認(rèn)i為0
for (key in 0 until arrayB.size) {
Log.e(Tag, arrayB[key].toString())
}
arrayA.distinct()//數(shù)組去重
var toSet:Set<Int> = arrayA.toSet()//數(shù)組去重巴柿,并分會set集合
}
第一種val arrayA: Array<Int> = arrayOf(1, 2, 3)
長度固定不可數(shù)據(jù)類型不可變
第二種val arrayB = Array(3, { i -> (i + 10) * 2 })
Array中的兩個參數(shù)分別說明以下,3表示數(shù)組的長度死遭,第二個參數(shù){ i -> (i + 10) * 2 }
广恢,主要在于理解后半部分,這里i的值從0開始按照(i + 10) * 2
的方式變化呀潭,每次i的值自增1钉迷,則數(shù)組中類容為[20,22钠署,24]糠聪。
條件語句
這個暫時好像沒什么好說的,只需要注意一點Kotlin中if語句可以作為表達(dá)式來使用比如下面的示例谐鼎,var value = if (a!! > b) a else b
舰蟆,以及區(qū)間在if語句中的運用
fun aboutTrinityOperator() {
//int c = 1 > 2 ? 1 : 2; //Java中三目運算符
@Suppress("CanBeVal")
var a: Int? = 1
val b = 2
//補充一下前面沒有寫到的一個內(nèi)容 Kotlin中將一個對象轉(zhuǎn)換為數(shù)據(jù)類型使用 !! 拋出空指針(),類似Java中出箱
var value = if (a!! > b) a else b
//Java中寫法
if (a >= 10 || a <= 20) {
}
//結(jié)合區(qū)間的寫法
if (a in 10..20) {
}
}
循環(huán)語句
這個比較尷尬 Kotlin中廢除了Java中for(初始值;條件;變化趨勢)的規(guī)則,增加一些如下關(guān)鍵字
- downTo 遞減
- step 步長 默認(rèn)步長為1
- until 左閉右開
- 等等...
總的來說感覺for循環(huán)在Kotlin中沒有Java中好用了身害,不過 while循環(huán)可以代替for循環(huán)具體用法往下看吧
fun aboutFor() {
var arrayA: Array<Int> = arrayOf(1, 2, 3, 4, 5)
var arrayB: Array<String> = arrayOf("a", "b", "c")
//直接遍歷所有元素
for (item in arrayA) {
//打印arrayA中所有元素
}
//遍歷區(qū)間1-98 步長為3
for (item in 1 until 99 step 3) {
//打印 1 4 7 10 步長為3 類似 for(...;...;i=i+3){}
}
//遍歷區(qū)間遞減
for (item in 99 downTo 1 step 2) {
//打印99-97-95....
}
for (item in 10 until 1) {//無法執(zhí)行 util僅僅支持升序
Log.e(Tag, item.toString())
}
//根據(jù)數(shù)據(jù)的下標(biāo)進(jìn)行遍歷
for ((index, value) in arrayB.withIndex()) {
Log.e(Tag, "the element at $index is $value")//0-3
//打印內(nèi)容如下:the element at 0 is a
//the element at 1 is b
//the element at 2 is c
}
}
感覺就是foreach循環(huán)的強(qiáng)化版...有木有味悄?,while和do..while循環(huán)的話差不多就不寫了塌鸯,上面主要是語法上的一些不同侍瑟,第一次在簡書上發(fā),好緊張...