• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • [Kotlin]Kotlin學習筆記(一):環境搭建及Kotlin特色語法學習筆記

    標簽: Kotlin  學習筆記  特色語法  Kotlin學習  環境配置

    >Kotlin環境的搭建

        Kotlin是JetBrain公司推出的基于JVM的編程語言,個人感覺就是JAVA的Swift版本吧。加上被google宣布為android的官方支持開發語言,未來使用的空間和必要性不言而喻。

        由于是JetBrain公司推出的公司,其名牌IDE產品——IntelliJ IDEA,自帶運行Kotlin所需要的內容,開發者所需要做的只是去下載一個JDK,并在新建工程時指定JDK目錄位置即可。

        此處提到的、值得一知的搭建Kotlin環境,主要針對以下兩種編譯器:

    1.Eclipse:

    點擊Help-Eclipse Marketplace-搜索Kotlin:

    如果你之前已經配置好JDK位置了,直接New一個Kotlin Project,并建立一個Kotlin Class/File就可以開始測試Kotlin了:

    fun main(args: Array<String>){
        println("Hello Kotlin World!")
    }
    2.Android Studio:

    點擊File-Setting-Plugins-搜索Kotlin-安裝Kotlin語言包-重啟Android Studio
    新建一個Android Studio工程,在project-build.gradle中手動指定一下Kotlin版本:

    ext.kotlin_version = '1.0.3'
    在module-build.gradle配置Kotlin插件和類庫:

    apply plugin: 'kotlin-android'
    apply plugin: 'kotlin-android-extensions'
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

    >Kotlin學習筆記:基礎及特色語法研究

    1.注釋及語句

    //單行注釋
    /*多行注釋*/

    同時,Kotlin不再強調句尾需要 ; 作為語句間的區分,但你仍然可以用分號來對同一行兩個語句進行手動區分,如:

    val a:Int=7 ; val b:Int = 8

    2.字符串模板

    Kotlin支持類似XML中的$變量:

    $varName //varName是任意變量名
    ${varName.funcation()}
    如對于Int值a和類Base中的輸出類名的函數boo(),測試以下代碼,最后兩行會輸出的值為:

    val a:Int = 7
    val b:Base = Base()
    
    println("Line1:a = $a")//輸出 Line1:a = 7
    println("Line2:b.boo() = ${b.boo()}")//輸出 Line2:b.boo() = Base
    3.區間

    區間主要有以下幾個寫法:(基于關鍵字 in    ..    downTo     step    until    !in

    i in 3 .. 6 // 3<=i && i<=6
    i in 3 .. 6 step 2 // i=3 i=5
    i in 6 downTo 3 // i=6 5 4 3
    i in 3 until 6 // 3<=i && i<6 
    • .. 主要用于標注區間,對于a .. b,其相當于[a,b],也就是for(i=a;i<=b;i+=1);
    • step 主要用于標注前進的步長,對于上面第二句代碼,相當于for(i=3;i<=6;i+=2)。同時,要注意步長必須為正數
    • downTo 表示逆序遞減,對于上面第三句代碼,相當于for(i=6;i>=3;i--),同樣,可以用step修飾,如:i in 6 downTo 3 step 2;
    • until 表示一個去尾元素,如上面第四句代碼,相當于for(i=3;i<6;i++);
    • in 和 !in 表示前導元素i是否在后續區間中

    一定有人有疑問,基于這樣的區間,對于for(int i=3;i<=6;i*=2)該怎么表示?

     答案是沒法表示。for語句在kotlin中用作迭代,不是基于條件轉移控制的語句。要實現上面的那個語句,需要用到while。待會兒再細講。

    區間(a .. b)的本質是創建一個數列,for中的" i in 區間 ",實際上是在進行一個區間數列的迭代,所以諸如i*=2之類的操作是沒法進行的。

    順便說一下,其實對于C語言中的for,我一直覺得跟while完全沒區別,while能做到的for也能做到,while簡直冗余。


    還有人要問,downTo的區間也是[a,b],那怎么實現[a,b)?可以用until修飾嗎?

    答案是依舊不行。只能手動寫成 [a,b-1]了。

    另外要注意數列必須是正序的,除非使用了downTo,如:

    if(i in 8 .. 1)println("這句話永遠不會輸出")

    還有一些問題,區間可以用來做什么呢?

    其一是:條件判斷,如:

    if(a !in 7 .. 10)println("yes")//a的值不在[7,10]之間時,輸出字符串"yes"
    那么,下面這個句子到底會輸出什么呢?
    var a:Int = 7
    if(a in 5 .. 9 step 3 )println("$a 會輸出嗎?")
    答案是不會輸出,因為7+3 > 9,已經超出了這個區間,所以if判斷為false。
    其二是:生成數列

    對于這個語句:

    println(3 .. 10 step 2)//輸出為 3 .. 9 step 2
    輸出:

    而生成數列最大的用處就是用于for循環的迭代了。這個簡單,就不再說了。

    其三是:字符串包含性判斷

    if("Hello" in "Hello world".."=w=") println("yes")//輸出yes

    4.類型判斷

    Kotlin提供了對于一個對象的類型判斷關鍵字 is 和 !is。注意,子類型的對象同時也是父類型的對象(詳見下)

    obj is class
    對于Base的對象base,有如下語句;另,Child是Base的子類型,Father是Base的父類型
    if(base is Father) println("父")
    if(base is Base) println("自己")
    if(base is Child) println("兒")
    輸出結果為:

    5.函數定義

    語法為:

    [權限修飾符,默認為public] fun 函數名(參數:參數類型){
    //函數體
    }
    當然這個很簡單,其匿名形式為:

    [權限修飾符] fun (參數:參數類型) : 返回值類型 = 函數體
    傳參可以是變長類型,利用vararg修飾,如下面這個函數:

    fun varFun(vararg v:Int){
         for(vt in v){
              println(vt)
         }
    }
    varFun(6,6,6,6,8)//輸出6 6 6 6 8

    6.Lambda表達式(&& 匿名Lambda函數)

    比較下面這三個函數:


    Lambda的匿名體現在對函數聲明的匿名化,從原始函數add開始,不斷簡化,到了add4,甚至只剩下函數體({}間的部分)

    Lambda的語法為:

    定義lambda表達式vaName:(參數類型) ->返回類型 = { 參數 -> 返回內容}
    定義lambda表達式varName = { 參數:類型 -> 返回內容}//此時返回內容的類型會自動識別
    注意,{}里的才叫做Lambda表達式。左邊等號前面的只是一種定義形式,方便調用而已(如果“完全匿名”,就只能在寫出的地方使用一次,而無法全局調用)。
    如下面這個句子里,直接使用了Lambda表達式而不使用其定義:

    fun max(S:Boolean , { a , b -> a < b }){
    }
    這個語句中的{ a, b -> a<b }本身就是一個匿名的Lambda表達式,整個max函數是一個傳參帶有函數返回值的高階函數,其完全體形式應為:

    fun max(S:Boolean , compare(a:Int , b:Int)){
    }
    fun compare(a:Int , b:Int){
        return a < b
    }
    這樣說明應該很清楚了。

    對了,上圖中的add2,改成 fun ( x:Int , y:Int ):Int = x+y,其實就是add的匿名函數

    7.字符串拼接

    Kotlin支持Java中字符串間的+拼接,同時支持一種多行拼寫:""" ,例子:

    val ss3:String = """
        |第一行
        |第二行222
        |第三行
        &第四行|
                |第五行
        """.trimMargin()
        println(ss3)

    輸出結果為:

    第一行
    第二行222
    第三行
        &第四行|
    第五行
    trimMargin(String 修建關鍵字)可以修建掉修建關鍵字及每行前的空格(保證對齊)。默認使用"|"作為修建關鍵字。

    8.位操作符及裝箱等操作

    shl(bits) – 左移位 (Java <<)
    shr(bits) – 右移位 (Java >>)
    ushr(bits) – 無符號右移位 (Java’s >>>)
    ushl(bits) – 無符號左移位 (Java’s <<<)
    and(bits) – 與操作
    or(bits) – 或
    xor(bits) – 異或
    inv() – 位取反
    ===  – 地址比較
    == – 值比較

    網上關于===的“封箱”,是一個套用自官網的說明。經過我對JVM的回憶和理解,我覺得這個例子有問題,于是我找到了這么一個trap:

        val b:Int = 5
        val b1:Int? = b
        val b11:Int? = b
        println(b1 === b11) // 注意這里打印的是 'true'
    
        val a: Int = 10000
        val a1: Int? =a
        val a11: Int? = a
        println (a1 === a11 ) //注意這里打印的是 'false'
    如圖所示:

    我看了大部分的中文資料,都提到裝箱的問題。但是我去看了一下源碼,才知道他們都是扯淡。只要把Int的值換成128一下的整型數,都不會進行所謂的“裝箱”處理。

    這分明是一個JVM問題,涉及到緩存池,大部分教程在這里都沒有說明白,甚至就是直接引用官網的說明文檔。

    這是這個問題的具體解釋:JVM把[-128,127]的所有數字全部緩存了,任何指向這個范圍的對象,都不可能被另外創建,又何談“裝箱”


    版權聲明:本文為Shenpibaipao原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/Shenpibaipao/article/details/76805070

    智能推薦

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    猜你喜歡

    styled-components —— React 中的 CSS 最佳實踐

    https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...

    基于TCP/IP的網絡聊天室用Java來實現

    基于TCP/IP的網絡聊天室實現 開發工具:eclipse 開發環境:jdk1.8 發送端 接收端 工具類 運行截圖...

    19.vue中封裝echarts組件

    19.vue中封裝echarts組件 1.效果圖 2.echarts組件 3.使用組件 按照組件格式整理好數據格式 傳入組件 home.vue 4.接口返回數據格式...

    劍指Offer39-調整數組順序使奇數位于偶數前面

    一開始想著用冒泡排序的方法來做,但是bug還是很多,后來看了評論區答案,發現直接空間換時間是最簡單的,而且和快排的寫法是類似的。...

    【一只蒟蒻的刷題歷程】【藍橋杯】歷屆試題 九宮重排 (八數碼問題:BFS+集合set)

    資源限制 時間限制:1.0s 內存限制:256.0MB 問題描述 如下面第一個圖的九宮格中,放著 1~8 的數字卡片,還有一個格子空著。與空格子相鄰的格子中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。 我們把第一個圖的局面記為:12345678. 把第二個圖的局面記為:123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格記為句點。 本題目的任務是已知九宮的初態...

    精品国产乱码久久久久久蜜桃不卡