Kotlin-語言

概述

  • Kotlin是面向?qū)ο蟮撵o態(tài)類型語言;
  • 在Kotlin中顶瞒,所有東西都是對(duì)象夸政,在這個(gè)意義上可以在任意變量上調(diào)用成員函數(shù)與屬性;
  • Kotlin優(yōu)點(diǎn)
    • 簡潔
      • 提供了大量的語法搁拙;
      • 減少樣板代碼秒梳;
    • 安全
      • 減少空指針判斷;
      • 類型支持可空箕速;
    • 互操性
    • 協(xié)程
  • 來源于 Kotlin1.3.50 官方文檔

基礎(chǔ)

    • 包的聲明位于源文件頂部酪碘;
    • 目錄與包的結(jié)構(gòu)可以無需匹配;
    • 源文件的所有聲明(包括類盐茎,函數(shù)兴垦,變量)都包含在包的聲明中;
    • 以下包會(huì)默認(rèn)導(dǎo)入Kotlin文件
      • kotlin.*
      • kotlin.annotation.*
      • kotlin.collections.*
      • kotlin.comparisons.*
      • kotlin.io.*
      • kotlin.ranges.*
      • kotlin.sequences.*
      • kotlin.text.*
    • 根據(jù)目標(biāo)平臺(tái)會(huì)導(dǎo)入額外的包
      • JVM
        • java.lang.*
        • kotlin.jvm.*
      • JS
        • kotlin.js.*
    • import
      • 可以導(dǎo)入指定Kotlin文件字柠;用來導(dǎo)入類探越,頂層函數(shù)和屬性,在對(duì)象聲明中聲明的函數(shù)和屬性窑业,枚舉常量钦幔;
      • 如果名字沖突,可以用 as 起個(gè)別名常柄;
  • 基本類型
    • Kotlin中基本類型有:數(shù)字鲤氢,字符,布爾西潘,數(shù)組與字符串卷玉;
    • 數(shù)字
      • 對(duì)于整數(shù)有四類:Byte Short Int Long,對(duì)應(yīng)字節(jié)長度為 8 16 32 64喷市;不顯式指定類型時(shí)相种,未超過 Int 最大值的整數(shù)被推斷為 Int 類型,否則推斷為 Long品姓,除非后綴 L 顯式指定 Long 類型寝并;
      • 無符號(hào)整數(shù)類型:UByte UShort UInt ULong;字面量整數(shù)后綴 u U 表示無符號(hào)類型缭黔;
      • 對(duì)于浮點(diǎn)數(shù)有兩類:Float Double食茎,對(duì)應(yīng)字節(jié)長度為 32 64;默認(rèn)推斷為 Double 馏谨,除非后綴 f / F 顯式指定 Float 類型别渔;
      • 在Java平臺(tái),數(shù)字是物理存儲(chǔ)為JVM中的原生類型惧互;
      • 兩個(gè)數(shù)字對(duì)象保留了相等性(==)哎媚,但不保留同一性(===);
      • 數(shù)字之間沒有隱式轉(zhuǎn)換(小類型隱式轉(zhuǎn)換為大類型)喊儡;
      • + - * / % 可用于數(shù)字間運(yùn)算拨与;
      • 位運(yùn)算
        • 沒有特殊字符用于位運(yùn)算;只可用中綴方式調(diào)用具名函數(shù)艾猜;只能用于 Int Long买喧;
        • shl(bits) - 有符號(hào)左移
        • shr(bits) - 有符號(hào)右移
        • ushl(bits) - 無符號(hào)左移
        • ushr(bits) - 無符號(hào)右移
        • and(bits) - 位與
        • or(bits) - 位或
        • xor(bits) - 位異或
        • inv() -位非
      • 邏輯運(yùn)算
        • == ===
        • < <= > >=
        • in a...b !in a...b
    • 字符
      • Char 表示捻悯,字面常量用單引號(hào)括起來,支持轉(zhuǎn)義字符和Unicode轉(zhuǎn)義序列淤毛;
    • 布爾
      • Boolean 表示今缚,有兩個(gè)值 true false
      • 邏輯運(yùn)算有 || && !低淡;
    • 數(shù)組
      • 數(shù)組用 Array 表示姓言,定義了 operator fun get(index: Int): T operator fun set(index: Int, value: T): Unit 函數(shù);
      • 數(shù)組類型不是協(xié)變的蔗蹋,不同于Java中的數(shù)組類型何荚;
      • 有專門的原生數(shù)組類型:ByteArray IntArray 等等;無符號(hào)原生數(shù)組類 UByteArray UShortArray UIntArray ULongArray猪杭;
    • 字符串
      • 字符串用 String 表示餐塘,字符串的元素--字符可以用索引表示 s[1]
      • 字符串模版
  • 變量
    • val 用來定義只讀變量皂吮,只能為其賦值一次唠倦;var 用來定義可修改變量;
  • 控制流
    • if
      • if 也可以當(dāng)作表達(dá)式涮较;當(dāng) if 當(dāng)作表達(dá)式(返回一個(gè)值)而不是語句時(shí)稠鼻,需要 else 分支;
    • when
      when (x) {
       1 -> print("x == 1")
       2 -> print("x == 2") 
        else -> {
           // 注意這個(gè)塊
           print("x is neither 1 nor 2") 
        } 
      }
      
      when (x) {
       0, 1 -> print("x == 0 or x == 1")
       else -> print("otherwise") 
      }
      
      when (x) {
       in 1..10 -> print("x is in the range") 
       in validNumbers -> print("x is valid") 
       !in 10..20 -> print("x is outside the range")
       else -> print("none of the above") 
      }
      
      • when 將它的參數(shù)與所有的分支條件順序比較狂票,直到某個(gè)分支滿足條件候齿;when 既可以當(dāng)作語句闺属,也可以當(dāng)作表達(dá)式慌盯;作為表達(dá)式亚皂,必須有 else 分支禁漓;
      fun Request.getBody() = 
          when (val response = executeRequest()) { 
            is Success -> response.body 
            is HttpError -> throw HttpException(response.status) 
        }
      
      • 自 Kotlin 1.3 起,可以使用以下語法將 when 的主語(subject烁试,譯注:指 when 所判斷的表達(dá)式)捕獲到變量中据途;在 when 主語中引入的變量的作用域僅限于 when 主體裆蒸;
    • for
      for (item in items) { ... }
      for (index in 1...100) { ... }
      
      • 可以使用 in 關(guān)鍵詞俺榆;
    • while
      • while do while 和其他語言一樣装哆;
    • return break continue
      • return 默認(rèn)從直接包圍的函數(shù)或者匿名函數(shù)返回罐脊;支持返回標(biāo)簽函數(shù);
      • break 默認(rèn)從直接包圍循環(huán)跳出蜕琴;支持跳出標(biāo)簽循環(huán)爹殊;
      • continue 默認(rèn)進(jìn)入直接包圍循環(huán)的下一次迭代;支持進(jìn)入標(biāo)簽循環(huán)的下一次迭代奸绷;
  • 表達(dá)式
  • 函數(shù)
    • Kotlin中函數(shù)是頭等公民梗夸;這表明函數(shù)可以存儲(chǔ)在變量和數(shù)據(jù)結(jié)構(gòu)中,作為參數(shù)傳遞給高階函數(shù)或者從高階函數(shù)中返回号醉;
    • 函數(shù)聲明
      fun sum(a: Int, b: Int): Int { return a + b }
      
      • 定義了函數(shù)名為 sum反症,參數(shù) aInt 類型 bInt 類型辛块,返回類型為 Int 的函數(shù);
      • 如果返回類型為無意義的值铅碍,用 Unit 表示润绵,可省略返回類型;return 語句可推斷返回類型時(shí)胞谈,也可省略顯式聲明的返回類型尘盼;
      fun sum(a: Int, b: Int) = a + b
      
      • 用表達(dá)式表示函數(shù)體;
    • 函數(shù)參數(shù)
      • 函數(shù)參數(shù)可以有默認(rèn)值烦绳;調(diào)用時(shí)可以不傳遞有默認(rèn)值的參數(shù)卿捎;
      • 最后一個(gè)參數(shù)可以是可變數(shù)量參數(shù),用 vararg 前綴径密;
    • 函數(shù)作用域
      • 函數(shù)可以在頂部聲明午阵,也可以在類中聲明,還可以在函數(shù)中嵌套聲明享扔;
      • 局部函數(shù)是在一個(gè)函數(shù)內(nèi)聲明的函數(shù)底桂,可以訪問外部函數(shù)(閉包)的局部變量;
    • 擴(kuò)展函數(shù)
    • 中綴函數(shù)
      • 中綴函數(shù)用 infix 表示惧眠;
      • 中綴函數(shù)必須只有一個(gè)參數(shù)籽懦,不能有默認(rèn)值,不能是可變數(shù)量參數(shù)氛魁;
    • 作用域函數(shù)
      • Kotlin 標(biāo)準(zhǔn)庫包含幾個(gè)函數(shù)猫十,它們的唯一目的是在對(duì)象的上下文中執(zhí)行代碼塊;當(dāng)對(duì)一個(gè)對(duì)象 調(diào)用這樣的函數(shù)并提供一個(gè) lambda 表達(dá)式時(shí)呆盖,它會(huì)形成一個(gè)臨時(shí)作用域拖云;在此作用域中,可 以訪問該對(duì)象而無需其名稱应又,這些函數(shù)稱為作用域函數(shù)宙项;包括 let run with apply also;這些函數(shù)基本上做了同樣的事情:在一個(gè)對(duì)象上執(zhí)行一個(gè)代碼塊株扛;不同的是這個(gè)對(duì)象在塊中 如何使用尤筐,以及整個(gè)表達(dá)式的結(jié)果是什么;
      • 每個(gè)作用域函數(shù)之間 有兩個(gè)主要區(qū)別:
        • 上下文對(duì)象 this it
          • 在作用域函數(shù)的 lambda 表達(dá)式里洞就,上下文對(duì)象可以不使用其實(shí)際名稱而是使用一個(gè)更簡短的引用來訪問盆繁;
          • 每個(gè)作用域函數(shù)都使用以下兩種方式之一來訪問上下文對(duì)象:作為 lambda 表達(dá)式的接收者( this )或者作為 lambda 表達(dá)式的參數(shù)( it );run with apply 中上下文對(duì)象為 this旬蟋,let also 中上下文對(duì)象為 it 油昂;
        • 返回值
          apply also 返回上下文對(duì)象;let run with 返回lambda表達(dá)式結(jié)果;
    • 高階函數(shù)
      • 高階函數(shù)是將函數(shù)用作參數(shù)或者返回值的函數(shù)冕碟;
      • 函數(shù)類型
        • 函數(shù)類型聲明
          (A, B, C,...) -> R
          A.(B, C,...) -> R
          
          • 以上表示一個(gè)函數(shù)類型拦惋,其中A,B安寺,C表示函數(shù)的參數(shù)類型厕妖,R表示返回類型;
          • 函數(shù)類型可以有一個(gè)額外的接受者挑庶;
        • 函數(shù)類型實(shí)例化
          • 使用函數(shù)字面值的代碼塊
            • lambda表達(dá)式
            • 匿名函數(shù)
          • 使用已有聲明的可調(diào)用引用
            • 頂層言秸,局部,成員迎捺,擴(kuò)展函數(shù):::isOdd() String::toInt举畸;
            • 頂層,成員破加,擴(kuò)展屬性:List<Int>::size
            • 構(gòu)造函數(shù):::Regex雹嗦;
          • 使用實(shí)現(xiàn)函數(shù)型接口的自定義類的實(shí)例
        • 函數(shù)類型實(shí)例調(diào)用
          • 函數(shù)類型的值可以直接調(diào)通過操作符 invoke(...) 調(diào)用:f.invoke(x) 或者 f(x)范舀;
      • lambda表達(dá)式
        • lambda表達(dá)式與匿名函數(shù)是 函數(shù)字面值,即未聲明函數(shù)了罪,但是可以立即作為表達(dá)式傳遞锭环;
        val sum: (Int, Int) -> Int = { x: Int, y: Int -> x + y }
        
        • -> 前面是函數(shù)參數(shù),后面是函數(shù)體泊藕;
        • 如果函數(shù)的最后一個(gè)參數(shù)是函數(shù)辅辩,那么作為相應(yīng)參數(shù)傳入的 lambda 表達(dá)式可以放在圓括號(hào)之外;也叫尾式 lambda 表達(dá)式娃圆;如果函數(shù)只有一個(gè)函數(shù)作為參數(shù)玫锋,圓括號(hào)可以省略;
        • 如果 lambda 表達(dá)式只有一個(gè)參數(shù)讼呢,可以省略 參數(shù)聲明撩鹿,直接用 it 表示;
        • lambda 缺少返回類型(雖然可以推斷出來)悦屏,但是匿名函數(shù)可以顯式指定返回類型节沦;
        • lambda 表達(dá)式或者匿名函數(shù),以及局部函數(shù)和對(duì)象表達(dá)式础爬,可以訪問閉包甫贯,即在外部作用域中聲明的變量;
        • 帶有接受者的函數(shù)字面值看蚜;
    • 內(nèi)聯(lián)函數(shù)
      • 使用高階函數(shù)叫搁,會(huì)帶來運(yùn)行時(shí)的效率損失:每個(gè)函數(shù)都是一個(gè)對(duì)象,并且會(huì)捕獲一個(gè)閉包,內(nèi)存分配(對(duì)于函數(shù)對(duì)象和類)和虛擬調(diào)用都會(huì)引入運(yùn)行時(shí)開銷常熙;
  • 類與對(duì)象
      • 類用 class 表示纬乍;類聲明由類名,類頭(類型參數(shù)裸卫,主構(gòu)造函數(shù))和類體構(gòu)成仿贬,類頭和類體是可選的;
      • 類的成員包括
        • 構(gòu)造函數(shù)與初始化塊
        • 函數(shù)
        • 屬性
        • 嵌套類與內(nèi)部類
        • 對(duì)象聲明
    • 主構(gòu)造函數(shù)
      class Person constructor(firstName: String) { /*……*/ }
      
      • 主構(gòu)造函數(shù)是類頭的一部分墓贿;如果主構(gòu)造函數(shù)沒有任何注解或者可見性修飾符茧泪,則可以省略 constructor 關(guān)鍵字;主構(gòu)造函數(shù)不能包含任何的代碼聋袋;
      • 初始化代碼可以放在 init 開頭的代碼塊中队伟;在實(shí)例初始化期間,初始化塊按照在類體中出現(xiàn)的順序執(zhí)行幽勒,與屬性初始化器交織在一起嗜侮;主構(gòu)造器的參數(shù)可以在初始化塊和屬性初始化器中使用;
    • 次構(gòu)造函數(shù)
      • 如果有主構(gòu)造函數(shù)啥容,那么次構(gòu)造函數(shù)必須委托給主構(gòu)造函數(shù)或者另一個(gè)次構(gòu)造函數(shù)(:this())锈颗;
      • 委托給主構(gòu)造函數(shù)會(huì)作為次構(gòu)造函數(shù)的第一條語句,及時(shí)沒有主構(gòu)造函數(shù)咪惠,初始化塊和屬性初始化器也會(huì)隱式委托击吱;
    • 實(shí)例
      • 沒有 new 關(guān)鍵字;
    • 屬性
      var <propertyName>[: <PropertyType>] [= <property_initializer>] 
        [<getter>] 
        [<setter>]
      
      • 初始化器(initializergetter setter 都是可選的遥昧;如果可以從初始化器中推斷出類型覆醇,屬性類型也可以省略;
      • val 不允許 setter炭臭;
      • 當(dāng)一個(gè)屬性需要幕后字段時(shí)永脓,會(huì)自動(dòng)提供,可以使用 field 在訪問器中使用鞋仍;如果屬性至少一個(gè)訪問器使用默認(rèn)實(shí)現(xiàn)憨奸,或者自定義訪問器通過 field 引用幕后字段,將會(huì) 為該屬性生成一個(gè)幕后字段凿试;
      • 幕后屬性
      • 如果只讀屬性的值在編譯期是已知的排宰,那么可以使用 const 修飾符將其標(biāo)記為編譯期常量;
      • 延遲初始化
        • 屬性聲明為非空類型,必須在構(gòu)造函數(shù)中初始化那婉;但是可以通過 lateinit 延遲初始化板甘;并且不能是原生類型;
        • 如果在未初始化時(shí)訪問一個(gè) lateinit 屬性详炬,會(huì)拋出異常盐类;
      • 繼承
        • 單繼承寞奸,根類為 Any ,有三個(gè)方法: hashCode() toString() equals()在跳;
        • 覆蓋方法
          • 基類中可覆蓋方法用 open 修飾枪萄;對(duì) final 類用 open 則無效;
          • 子類中覆蓋方法用 override 修飾猫妙;override 本身是 open 的瓷翻,如果不想再被子類覆蓋,需要用 final 修飾割坠;
        • 覆蓋屬性
          • 與覆蓋方法類似齐帚,必須具有兼容的類型;可以用 var 屬性覆蓋 val 屬性彼哼,反之不行对妄;
          • 可以在主構(gòu)造函數(shù)中用 override 覆蓋屬性(可以理解為構(gòu)造函數(shù)的參數(shù));
      • 擴(kuò)展
        • Kotlin 能夠擴(kuò)展一個(gè)類的新功能而無需繼承該類或者使用像裝飾者這樣的設(shè)計(jì)模式敢朱;
        • 擴(kuò)展函數(shù)
          fun MutableList<Int>.swap(index1: Int, index2: Int) {
           val tmp = this[index1]
           // “this”對(duì)應(yīng)該列表 
           this[index1] = this[index2] 
           this[index2] = tmp 
          }
          
          • 聲明一個(gè)擴(kuò)展函數(shù)剪菱,我們需要用一個(gè) 接收者類型也就是被擴(kuò)展的類型來作為他的前綴;
          • this 表示擴(kuò)展函數(shù)的接受者對(duì)象拴签;
          • 為了在接收者類型表達(dá)式中使用泛型孝常,我們要在函數(shù)名前聲明泛型參數(shù);
          • 擴(kuò)展是靜態(tài)解析的篓吁;擴(kuò)展不能真正的修改他們所擴(kuò)展的類茫因。通過定義一個(gè)擴(kuò)展蚪拦,你并沒有在一個(gè)類中插入新成 員杖剪, 僅僅是可以通過該類型的變量用點(diǎn)表達(dá)式去調(diào)用這個(gè)新函數(shù);
        • 擴(kuò)展屬性
        • 伴生對(duì)象的擴(kuò)展
          • 可以為伴生對(duì)象擴(kuò)展函數(shù)與屬性驰贷;
      • 委托
        • Java中的委托模式
          class Derived(b: Base) : Base by b
          
          • Derived 類可以通過將其所有公有成員都委托給指定對(duì)象(by b)盛嘿;
        • 委托屬性
          val/var <屬性名>: <類型> by <表達(dá)式>
          
          • 延遲屬性 Lazy
            val lazyValue: String by lazy { 
              println("computed!") 
              "Hello" 
            }
            
            • 用于 val 屬性;
          • 可觀察屬性 Observable
            var name: String by Delegates.observable("<no name>") { 
              prop, old, new -> 
              println("$old -> $new") 
            }
            
      • 數(shù)據(jù)類
        • 數(shù)據(jù)類用 data class 表示括袒;
        • 主構(gòu)造函數(shù)的參數(shù)必須用 var val 聲明次兆;
      • 密封類
        • 密封類用 sealed class 表示;
        • 密封類的子類必須在同一個(gè)文件中锹锰,其他文件中無法訪問芥炭;密封類是抽象的;構(gòu)造函數(shù)是 private 恃慧;
      • 枚舉類
        • 枚舉類用 enum class 表示园蝠;
      • 內(nèi)部類
        • 內(nèi)部類用 inner 表示,內(nèi)部類有外部實(shí)例痢士;
      • is 運(yùn)算符監(jiān)測一個(gè)表達(dá)式是否某類型的一個(gè)實(shí)例彪薛;
    • 對(duì)象
      • object 表示對(duì)象聲明,類似于Java中的單例對(duì)象;
      • 類體中 companion object 表示伴生對(duì)象善延,類似于Java中的靜態(tài)變量少态;
  • 集合
    • 基礎(chǔ)
      • 集合包括 List Set Map
      • 只讀集合是協(xié)變的 易遣;可變集合不是協(xié)變的彼妻;
    • 區(qū)間
      1...10
      1 until 10
      
      • 第一個(gè)表示閉區(qū)間 [1, 10],第二個(gè)表示開區(qū)間 [1, 10)训挡;
    • 數(shù)列
      • 可以在區(qū)間上加 step澳骤;
    • 集合操作
      • 集合操作一般定義為成員函數(shù)和擴(kuò)展函數(shù);
      • 操作不會(huì)影響原始集合澜薄,生成一個(gè)新的集合为肮;
      • 轉(zhuǎn)換
        • map
          • 參數(shù)為元素
          • 結(jié)果順序與原始順序相同肤京;
        • mapIndexed
          • 參數(shù)多了索引颊艳;
        • zip
          • 雙路合并是根據(jù)兩個(gè)集合中具有相同位置的元素構(gòu)建配對(duì);
          • 返回 Pair 對(duì)象的列表忘分;
        • associateWith
          • 關(guān)聯(lián)允許從集合元素與與其關(guān)聯(lián)的某些值構(gòu)建Map棋枕;
          • 以原始集合元素作為Map的鍵;
        • associateBy
          • 以原始集合元素作為Map的值妒峦;
        • associate
          • Map的鍵和值都是生成的重斑,lambda返回 Pair,對(duì)應(yīng)Map的Key和Value肯骇;
        • flatten
          • 可以在一個(gè)集合的集合上調(diào)用它窥浪;
        • flatMap
          • 需要一個(gè)函數(shù),將一個(gè)集合元素映射到另一個(gè)集合上笛丙;
      • 過濾
        • filter
        • filterIndex
        • partition
        • 返回一個(gè) List的Pair 漾脂,第一個(gè)List包含lambda符合條件的元素,第二個(gè)包含不符合lambda的元素胚鸯;
      • 檢驗(yàn)謂詞
        • any:至少一個(gè)匹配成功骨稿,返回true;
        • none:沒有元素匹配成功姜钳,返回true坦冠;
        • all:所有元素都匹配成功,返回true哥桥;空集合永遠(yuǎn)都返回true辙浑;
      • 分組
        • groupBy
          • 返回Map,key是lambda表達(dá)式的值泰讽,value為對(duì)應(yīng)元素的list例衍;
      • 取集合的一部分
        • slice
          • 返回給定索引的集合元素列表昔期;
        • take takeLast
          • 從頭部/尾部返回指定數(shù)量元素的集合;當(dāng)數(shù)量大于集合大小時(shí)佛玄,返回整個(gè)集合硼一;
        • drop dropLast
          • 從頭部/尾部去掉給定數(shù)量的元素;
        • chunked
          • 將集合分解為給定大小的“塊”梦抢;
        • windowed
      • 取單個(gè)元素
        • elementAt
        • first
        • last
        • random
      • 排序
      • 聚合
        • min
        • max
        • average
        • sum
        • count

協(xié)程

  • 協(xié)程后面會(huì)單獨(dú)講般贼;

習(xí)慣用法

  • 數(shù)據(jù)類
    data class Customer(val name: String, val email: String)
    
    • 會(huì)為 Customer 提供以下功能:
      • 所有屬性的 getters (對(duì)于 var 還會(huì)提供 setters);
      • equals()
      • hashCode()
      • toString()
      • copy()
      • 所有屬性的 component1() component2() 等等奥吩;
  • 單例
    object Resource { val name = "Name" }
    
  • 函數(shù)參數(shù)的默認(rèn)值
    fun foo(a: Int = 0, b: String = "") { …… }  
    
    • 在定義函數(shù)時(shí)深纲,可以設(shè)置參數(shù)的默認(rèn)值蘑志;
  • 擴(kuò)展函數(shù)
    fun String.spaceToCamelCase() { …… } 
    "Convert this to camelcase".spaceToCamelCase()
    
  • 單表達(dá)式函數(shù)
    fun theAnswer() = 42
    
  • 一個(gè)對(duì)象的多個(gè)方法調(diào)用
    class Turtle {
     fun penDown()
     fun penUp()
     fun turn(degrees: Double)
     fun forward(pixels: Double)
    }
    val myTurtle = Turtle()
    with(myTurtle) { // 畫一個(gè) 100 像素的正方形
     penDown()
     for(i in 1..4) {
       forward(100.0)
       turn(90.0)
     }
    penUp() }
    
  • 配置對(duì)象的屬性
    val myRectangle = Rectangle().apply {
     length = 4
     breadth = 5
     color = 0xFAFAFA
    }
    
  • 字符串模版
    println("Name $name")
    
  • 使用區(qū)間
    for (i in 1..100) { …… } // 閉區(qū)間:包含 100 
    for (i in 1 until 100) { …… } // 半開區(qū)間:不包含 100 
    for (x in 2..10 step 2) { …… } 
    for (x in 10 downTo 1) { …… } 
    if (x in 1..10) { …… }
    
  • 延遲屬性
    val p: String by lazy { // 計(jì)算該字符串 }
    

編碼規(guī)范

  • 目錄結(jié)構(gòu)
    • 包結(jié)構(gòu)與源文件目錄保持一致;
  • 源文件名稱
    • 如果源文件只包含單個(gè)類(以及可能相關(guān)的頂層聲明),那么文件名應(yīng)該和類名一致芯义,并后綴 .kt 焰薄;如果源文件包含多個(gè)類或只包含頂層聲明坎炼,那么選擇一個(gè)和該文件內(nèi)容相關(guān)的名稱凫海,并以此命名,使用大駝峰風(fēng)格旅东;
  • 源文件布局
    • 鼓勵(lì)多個(gè)聲明(類灭抑,頂層函數(shù)或者屬性)放在一個(gè)Kotlin文件中,只要這些聲明在語義上是相關(guān)聯(lián)的抵代;
  • 類布局
    • 類內(nèi)容應(yīng)該按照以下順序排列
      • 屬性聲明與初始化塊
      • 次構(gòu)造函數(shù)
      • 方法聲明
      • 伴生對(duì)象
      • 嵌套類(主要為了外部使用)
    • 不要按可見性或者字母順序?qū)Ψ椒ㄟM(jìn)行排序腾节,也不要將常規(guī)方法與擴(kuò)展方法分開;而是把相關(guān)方法放在一起荤牍,包括相關(guān)聯(lián)的嵌套類案腺;
    • 重載方法放在一起;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末参淫,一起剝皮案震驚了整個(gè)濱河市救湖,隨后出現(xiàn)的幾起案子愧杯,更是在濱河造成了極大的恐慌涎才,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件力九,死亡現(xiàn)場離奇詭異耍铜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)跌前,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門棕兼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抵乓,你說我怎么就攤上這事伴挚“醒埽” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵茎芋,是天一觀的道長颅眶。 經(jīng)常有香客問我,道長田弥,這世上最難降的妖魔是什么涛酗? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮偷厦,結(jié)果婚禮上商叹,老公的妹妹穿的比我還像新娘。我一直安慰自己只泼,他們只是感情好剖笙,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著请唱,像睡著了一般枯途。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上籍滴,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天酪夷,我揣著相機(jī)與錄音,去河邊找鬼孽惰。 笑死晚岭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的勋功。 我是一名探鬼主播坦报,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼狂鞋!你這毒婦竟也來了片择?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤骚揍,失蹤者是張志新(化名)和其女友劉穎字管,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體信不,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘲叔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抽活。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片硫戈。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖下硕,靈堂內(nèi)的尸體忽然破棺而出丁逝,到底是詐尸還是另有隱情汁胆,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布霜幼,位于F島的核電站沦泌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辛掠。R本人自食惡果不足惜谢谦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望萝衩。 院中可真熱鬧回挽,春花似錦、人聲如沸猩谊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牌捷。三九已至墙牌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間暗甥,已是汗流浹背喜滨。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留撤防,地道東北人虽风。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像寄月,于是被迫代替她去往敵國和親辜膝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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