Kotlin被指定為Android開發(fā)語法后很多新項(xiàng)目都開始采用kotlin語言進(jìn)行開發(fā)了考蕾,公司之前項(xiàng)目的重構(gòu)及新項(xiàng)目都打算采用kotlin進(jìn)行開發(fā)嗓节,所以又不得不重新深入學(xué)習(xí)下kotlin,下面這些只是本人在學(xué)習(xí)過程中的一些筆記。
環(huán)境搭建
kotlin被指定為Android開發(fā)語言后,Android studio開發(fā)工具已經(jīng)將kotlin內(nèi)置進(jìn)來了昼扛,按照相應(yīng)的開發(fā)插件就可以了,相對(duì)于其他的開發(fā)環(huán)境搭建還是比較簡單的欲诺,這里的開發(fā)工具是Android studio3.4版本抄谐,之前的版本稍微有點(diǎn)點(diǎn)不一樣。
打開Android studio 點(diǎn)擊File--->Settings--->Plugins--->Marketplace扰法,在輸入框內(nèi)輸入kotlin斯稳,進(jìn)行搜索,搜索到后找到kotlin插件點(diǎn)擊install進(jìn)行安裝迹恐;
安裝后重啟Android studio開發(fā)工具挣惰,和之前一樣新建工程項(xiàng)目;在Language那里選擇kotlin殴边,點(diǎn)擊finish憎茂,kotlin項(xiàng)目工程就建好了;整個(gè)項(xiàng)目的目錄結(jié)構(gòu)和java項(xiàng)目是一樣的锤岸,打開app目錄下的build.gradle竖幔,里面就自動(dòng)引入了kotlin開發(fā)所需要的依賴和配置;
如果之前是java工程是偷,后期迭代想使用kotlin開發(fā)也是可以的拳氢,安裝好插件,然后手動(dòng)在app module中引入依賴和配置蛋铆,還需要在項(xiàng)目的build.gradle進(jìn)行配置馋评;
配置好后,就可以進(jìn)行kotlin編寫了刺啦,在編寫前先看下kotlin的基本語言等內(nèi)容留特,下面一個(gè)kotlin官網(wǎng)和官方學(xué)習(xí)文檔;
官方網(wǎng)站
官方學(xué)習(xí)文檔
基本類型
kotlin的基本類型包括:數(shù)字玛瘸、字符蜕青、布爾和數(shù)組
數(shù)字
kotlin提供了如下的內(nèi)置類型來表示數(shù)字:
注意:在kotlin中字符不是數(shù)字
kotlin處理數(shù)字和java基本類似,但是kotlin中沒有隱士轉(zhuǎn)換糊渊,比如Int不能直接隱士轉(zhuǎn)出成Double右核,而要通過調(diào)用toDouble()方法進(jìn)行顯示轉(zhuǎn)換;
通過上面這些內(nèi)置方法可以進(jìn)行對(duì)應(yīng)的轉(zhuǎn)換渺绒,kotlin中字面常量是不支持八進(jìn)制贺喝,通過val關(guān)鍵字來定義字面常量磷瘤,同時(shí)可以還可以定義一個(gè)可空的引用(Int?)或泛型,不過可空的引用或泛型會(huì)把數(shù)字裝箱搜变;
val a:Int=100
println(a===a)//true
val boxA:Int?=a
val boxB:Int?=a
println(boxA===boxB)//false
println(a==a)//true
println(boxA==boxB)//true
字符及字符串
字符用Char表示,不能被直接當(dāng)做數(shù)字针炉,其他用法和java中差不多挠他;
字符串用String表示,字符串是不可變的篡帕,kotlin中提供了字符串模板殖侵,模板表達(dá)式以$開頭镰烧;
val b:Int=10
val c:String="b=$b"http://表示b=10
val d:String="b=$拢军"http://表示b=10
Boolean
布爾用Boolean類型表示,分為true和false
內(nèi)置的運(yùn)算符有:
數(shù)組
數(shù)組用Array表示怔鳖,可以使用arrayOf()來創(chuàng)建一個(gè)數(shù)組茉唉,并給它傳遞元素,也可以通過arrayOfNulls<Int>(5)來創(chuàng)建一個(gè)大小指定结执,但是元素都為空的數(shù)組度陆;
//創(chuàng)建一個(gè)數(shù)組 并對(duì)數(shù)組進(jìn)行遍歷 計(jì)算
val array=Array<Int>(5,{i: Int -> (i*i) })
關(guān)于數(shù)組的遍歷會(huì)在后面for或者while循環(huán)遍歷講到;
控制流
If表達(dá)式
在kotlin中献幔,if就是一個(gè)表達(dá)式懂傀,即它會(huì)返回一個(gè)值,因此普通的if就能勝任三元表達(dá)式的角色蜡感,以獲取兩個(gè)數(shù)中的最大值為例看下if表達(dá)式的寫法:
//寫法一
if(a>b){
return a
}else{
return b
}
//寫法二
var max=a
if(a<b) max=b
return max
//寫法三
val max=if(a>b) a else b
return max
//寫法四
val max=if(a>b){
a
}else{
b
}
return max
具體的寫法有很多蹬蚁,就不一一寫了,具體的可以根據(jù)項(xiàng)目的需要進(jìn)行寫郑兴,不過如果使用if作為表達(dá)式而不是語句犀斋,該表達(dá)式需要有else分支。
when表達(dá)式
kotlin中用when替換了switch情连,用法也比較簡單:
when(x){
1-> println("is 1")
2-> println("is 2")
else -> println("is other")
}
如果在開發(fā)中每個(gè)分支的代碼邏輯比較多闪水,也可以使用{}方式將每個(gè)分支進(jìn)行包裹:
when(x){
1-> {println("is 1")}
2-> {println("is 2")}
else -> {println("is other")}
}
如果碰到多分支需要同樣的處理時(shí),左邊的條件那里可以寫多個(gè)用,隔開:
when(x){
1,2-> {println("is 1 or 2")}
3-> {println("is 3")}
else -> {println("is other")}
}
左邊的表達(dá)式不只可以是常量蒙具,還可以是方法球榆、區(qū)間等各種方式:
when(x){
y.toInt()-> {println("is 1 or 2")}//y字符串通過toInt 轉(zhuǎn)成Int
in 3..5-> {println("is 3")}//in 3..5表示3到5的區(qū)間條件都成立
else -> {println("is other")}
}
如果項(xiàng)目需要的話,還可以直接定義一個(gè)常量或者變量直接接受when表達(dá)式的值禁筏,從而可以直接使用when的值進(jìn)行邏輯編寫:
val value=when(x){
y.toInt()-> {println("is 1 or 2")}//y字符串通過toInt 轉(zhuǎn)成Int
in 3..5-> {println("is 3")}//in 3..5表示3到5的區(qū)間條件都成立
else -> {println("is other")}
}
For循環(huán)
val list= listOf<Int>(1,3,422,44)
//第一種方式
for(item in list){
println("item=${item}")
}
//第二種方式
for(i in list.indices){
//i是對(duì)應(yīng)的list的角標(biāo) 通過list[i]的方式獲取角標(biāo)對(duì)應(yīng)的value
println("i=${i}item=${list[i]}")
}
//第三種方式
for((i,value) in list.withIndex()){
//i是對(duì)應(yīng)list的角標(biāo) value是對(duì)應(yīng)角標(biāo)的value
println("i=${i}value=${value}")
}
以上就是for循環(huán)大致的寫法持钉,當(dāng)然還有其他的寫法,具體可以根據(jù)需要進(jìn)行編寫篱昔,同時(shí)kotlin中還提供了range區(qū)間每强;
for(i in 0..10){
//表示0-10區(qū)間的遍歷 閉區(qū)間
println("i=${i}")//打印的是0到10
}
for(i in 0 until 10){
//表示0-10區(qū)間的遍歷 左閉右開
println("i=${i}")//打印的是0到9
}
for(i in 0..10 step 2){
//表示0-10區(qū)間的遍歷 閉區(qū)間 step步數(shù)為2 類似于javafor循環(huán)中的i++
println("i=${i}")//打印的是0 2 4 6 8 10
}
for(i in 10 downTo 0){
//表示10 0區(qū)間的遍歷 閉區(qū)間
println("i=${i}")//打印的是10 9 8 7 6 5 4 3 2 1 0
}
for(i in 10 downTo 0 step 2){
//表示10 0區(qū)間的遍歷 閉區(qū)間
println("i=${i}")//打印的是10 8 6 4 2 0
}
可以使用in和!in判斷在或者不在該區(qū)間內(nèi)始腾;
while和do..while循環(huán)
while和do..while的使用和java中基本一致
var x=100
while (x > 0) {
x--
println("x=x${x}")
}
do {
x--
println("x=x${x}")
}while (x>0)
break、continue和return
和java一樣提供了下面三種結(jié)構(gòu)化跳轉(zhuǎn)表達(dá)式:
break:種植最直接包圍它的循環(huán)
continue:繼續(xù)下一次最直接包圍它的循環(huán)
return:默認(rèn)從最直接包圍它的函數(shù)或者匿名函數(shù)返回
使用上面和java中一樣空执,不過kotlin還提供了標(biāo)簽這個(gè)東西浪箭,對(duì)應(yīng)單層循環(huán)或者單層函數(shù)來說沒有什么區(qū)別,對(duì)于循環(huán)嵌套或者函數(shù)嵌套調(diào)用就會(huì)不一樣了:
val list= listOf<String>("aa","bb","cc","dd")
looper@ for(i in list.indices){
for(j in list.indices){
if(list[j].equals("cc")){
//如果等于cc 就直接跳出雙層for循環(huán) 終止所有循環(huán)
break@looper
}
}
}
loop@ for(i in list.indices){
for(j in list.indices){
if(list[j].equals("cc")){
//如果等于cc 就直接跳過雙層for循環(huán) 從最外層繼續(xù)循環(huán)
continue@loop
}
}
}
大致具體的意思在注釋中寫了辨绊,相比之前沒有l(wèi)able標(biāo)簽奶栖,只是跳出或者跳過對(duì)應(yīng)的for循環(huán),在有些場(chǎng)景下回方便不少并且可以提高循環(huán)的效率门坷,如果在方法中添加lable標(biāo)簽宣鄙,return的時(shí)候也會(huì)不一樣哦:
fun returnFun(){
val list= listOf<String>("aa","bb","cc","dd")
list.forEach lit@{
if(it.equals("cc")){
//這里返回的只是返回list.forEach 的匿名函數(shù) 并不是返回returnFun函數(shù)
//list.forEach匿名函數(shù)后面的邏輯可以照樣執(zhí)行
return@lit
}
}
}