概述
- 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.*
- JVM
- 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)算;只可用中綴方式調(diào)用具名函數(shù)艾猜;只能用于
- 邏輯運(yùn)算
-
==
===
-
<
<=
>
>=
-
in a...b
!in a...b
-
- 對(duì)于整數(shù)有四類:
- 字符
- 用
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
猪杭;
- 數(shù)組用
- 字符串
- 字符串用
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ù)a
為Int
類型b
為Int
類型辛块,返回類型為Int
的函數(shù); - 如果返回類型為無意義的值铅碍,用
Unit
表示润绵,可省略返回類型;return
語句可推斷返回類型時(shí)胞谈,也可省略顯式聲明的返回類型尘盼;
fun sum(a: Int, b: Int) = a + b
- 用表達(dá)式表示函數(shù)體;
- 定義了函數(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ù)用
- 作用域函數(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é)果;
- 上下文對(duì)象
- 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ù)宙项;包括
- 高階函數(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
雹嗦;
- 頂層言秸,局部,成員迎捺,擴(kuò)展函數(shù):
- 使用實(shí)現(xiàn)函數(shù)型接口的自定義類的實(shí)例
- 使用函數(shù)字面值的代碼塊
- 函數(shù)類型實(shí)例調(diào)用
- 函數(shù)類型的值可以直接調(diào)通過操作符
invoke(...)
調(diào)用:f.invoke(x)
或者f(x)
范舀;
- 函數(shù)類型的值可以直接調(diào)通過操作符
- 函數(shù)類型聲明
- 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òu)造函數(shù)必須委托給主構(gòu)造函數(shù)或者另一個(gè)次構(gòu)造函數(shù)(
:this()
)锈颗; - 委托給主構(gòu)造函數(shù)會(huì)作為次構(gòu)造函數(shù)的第一條語句,及時(shí)沒有主構(gòu)造函數(shù)咪惠,初始化塊和屬性初始化器也會(huì)隱式委托击吱;
- 如果有主構(gòu)造函數(shù)啥容,那么次構(gòu)造函數(shù)必須委托給主構(gòu)造函數(shù)或者另一個(gè)次構(gòu)造函數(shù)(
- 實(shí)例
- 沒有
new
關(guān)鍵字;
- 沒有
- 屬性
var <propertyName>[: <PropertyType>] [= <property_initializer>] [<getter>] [<setter>]
- 初始化器(
initializer
)getter
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ì)拋出異常盐类;
- 屬性聲明為非空類型,必須在構(gòu)造函數(shù)中初始化那婉;但是可以通過
- 繼承
- 單繼承寞奸,根類為
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
)盛嘿;
- Derived 類可以通過將其所有公有成員都委托給指定對(duì)象(
- 委托屬性
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") }
- 延遲屬性 Lazy
- Java中的委托模式
- 數(shù)據(jù)類
- 數(shù)據(jù)類用
data class
表示括袒; - 主構(gòu)造函數(shù)的參數(shù)必須用
var
val
聲明次兆;
- 數(shù)據(jù)類用
- 密封類
- 密封類用
sealed class
表示; - 密封類的子類必須在同一個(gè)文件中锹锰,其他文件中無法訪問芥炭;密封類是抽象的;構(gòu)造函數(shù)是
private
恃慧;
- 密封類用
- 枚舉類
- 枚舉類用
enum class
表示园蝠;
- 枚舉類用
- 內(nèi)部類
- 內(nèi)部類用
inner
表示,內(nèi)部類有外部實(shí)例痢士;
- 內(nèi)部類用
-
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)
训挡;
- 第一個(gè)表示閉區(qū)間
- 數(shù)列
- 可以在區(qū)間上加
step
澳骤;
- 可以在區(qū)間上加
- 集合操作
- 集合操作一般定義為成員函數(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肯骇;
- Map的鍵和值都是生成的重斑,lambda返回
-
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
- 基礎(chǔ)
協(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()
等等奥吩;
- 所有屬性的
- 會(huì)為
- 單例
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)格旅东;
- 如果源文件只包含單個(gè)類(以及可能相關(guān)的頂層聲明),那么文件名應(yī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)的嵌套類案腺;
- 重載方法放在一起;
- 類內(nèi)容應(yīng)該按照以下順序排列