Kotlin Android開發(fā)篇—環(huán)境搭建及基礎(chǔ)法語

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)行安裝迹恐;

微信截圖_20190427101720.png

安裝后重啟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ā)所需要的依賴和配置;
微信截圖_20190427102354.png

如果之前是java工程是偷,后期迭代想使用kotlin開發(fā)也是可以的拳氢,安裝好插件,然后手動(dòng)在app module中引入依賴和配置蛋铆,還需要在項(xiàng)目的build.gradle進(jìn)行配置馋评;
微信截圖_20190427102642.png

配置好后,就可以進(jìn)行kotlin編寫了刺啦,在編寫前先看下kotlin的基本語言等內(nèi)容留特,下面一個(gè)kotlin官網(wǎng)和官方學(xué)習(xí)文檔;
官方網(wǎng)站
官方學(xué)習(xí)文檔

基本類型

kotlin的基本類型包括:數(shù)字玛瘸、字符蜕青、布爾和數(shù)組

數(shù)字

kotlin提供了如下的內(nèi)置類型來表示數(shù)字:


微信截圖_20190427104540.png

注意:在kotlin中字符不是數(shù)字
kotlin處理數(shù)字和java基本類似,但是kotlin中沒有隱士轉(zhuǎn)換糊渊,比如Int不能直接隱士轉(zhuǎn)出成Double右核,而要通過調(diào)用toDouble()方法進(jìn)行顯示轉(zhuǎn)換;


微信截圖_20190427105158.png

通過上面這些內(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)算符有:


微信截圖_20190427110750.png

數(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
            }
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市默蚌,隨后出現(xiàn)的幾起案子冻晤,更是在濱河造成了極大的恐慌,老刑警劉巖绸吸,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鼻弧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡锦茁,警方通過查閱死者的電腦和手機(jī)温数,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜻势,“玉大人撑刺,你說我怎么就攤上這事∥章辏” “怎么了够傍?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長挠铲。 經(jīng)常有香客問我冕屯,道長,這世上最難降的妖魔是什么拂苹? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任安聘,我火速辦了婚禮,結(jié)果婚禮上瓢棒,老公的妹妹穿的比我還像新娘浴韭。我一直安慰自己,他們只是感情好脯宿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布念颈。 她就那樣靜靜地躺著,像睡著了一般连霉。 火紅的嫁衣襯著肌膚如雪榴芳。 梳的紋絲不亂的頭發(fā)上嗡靡,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音窟感,去河邊找鬼讨彼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛柿祈,可吹牛的內(nèi)容都是我干的哈误。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼谍夭,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了憨募?” 一聲冷哼從身側(cè)響起紧索,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎菜谣,沒想到半個(gè)月后珠漂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尾膊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年媳危,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冈敛。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡待笑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抓谴,到底是詐尸還是另有隱情暮蹂,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布癌压,位于F島的核電站仰泻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏滩届。R本人自食惡果不足惜集侯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帜消。 院中可真熱鬧棠枉,春花似錦、人聲如沸泡挺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粘衬。三九已至荞估,卻和暖如春咳促,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背勘伺。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國打工跪腹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人飞醉。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓冲茸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親缅帘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子轴术,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容