關(guān)鍵字 | 注釋 |
---|---|
constructor | 構(gòu)造函數(shù) |
Any | Kotlin Any簡(jiǎn)介Any類型是Kotlin所有非空類型的超類型(非空類的根),包含像Int這樣的基本數(shù)據(jù)類型 |
open | 在Kotlin開(kāi)發(fā)中類和方法默認(rèn)不允許被繼承和重寫(xiě),等同于Java中用 final 修飾類和方法。如果在Kotlin 中類和方法想被繼承和重寫(xiě)睬塌,需添加open 關(guān)鍵字修飾灾梦。 |
final | 表示類不可繼承,默認(rèn)屬性 |
var | var是一個(gè)可變變量,這是一個(gè)可以通過(guò)重新分配來(lái)更改為另一個(gè)值的變量。這種聲明變量的方式和Java中聲明變量的方式一樣。 |
val | val是一個(gè)只讀變量邪码,這種聲明變量的方式相當(dāng)于java中的final變量。一個(gè)val創(chuàng)建的時(shí)候必須初始化咬清,因?yàn)橐院蟛荒鼙桓淖儭?/td> |
const | 表示靜態(tài)屬性闭专,在java中并不會(huì)生成get set |
set(value) {field = value} | 重寫(xiě)該屬性的get和set |
:: | 雙冒號(hào)奴潘,表示調(diào)用當(dāng)前 Class 的內(nèi)部方法 MainActivity::class.java。java的寫(xiě)法是XX.class |
companion | 類內(nèi)部的對(duì)象聲明可以用 companion 關(guān)鍵字標(biāo)記影钉,這樣它就與外部類關(guān)聯(lián)在一起画髓,我們就可以直接通過(guò)外部類訪問(wèn)到對(duì)象的內(nèi)部元素 |
by | 委托,可用于類委托和屬性委托 |
Lazy | 延遲屬性平委,第一次調(diào)用會(huì)有過(guò)程奈虾,后面就是只有純結(jié)果。lazy 應(yīng)用于單例模式(if-null-then-init-else-return)廉赔,而且當(dāng)且僅當(dāng)變量被第一次調(diào)用的時(shí)候肉微,委托方法才會(huì)執(zhí)行。lazy 只用于常量 val |
lateinit | 告訴編譯器我沒(méi)法第一時(shí)間就初始化蜡塌,但我肯定會(huì)在使用它之前完成初始化的碉纳。lateinit 只用于變量 var |
Not Null | 委托不能為空,如果使用的時(shí)候?yàn)榭樟蟀瑒t會(huì)拋出異常 |
by Delegates.observable | 實(shí)現(xiàn)觀察者模式村象,觀察屬性的變化 |
by map | 把屬性儲(chǔ)存在映射map中 |
類型? | 表示當(dāng)前xx對(duì)象可以為空 |
notNull(a,b) | notNull(a,b){ xxxx } 同時(shí)判斷多個(gè)變量為空時(shí)的邏輯處理 |
?: | foo?:bar攒至,如果foo不為null則返回foo,如果為null則返回bar |
xx?.toLong()?: 0 | xx如果為null就返回0,否則返回Long類型數(shù)值 |
!! | 判斷這個(gè)參數(shù)如果是空參數(shù),就拋出異常 |
?. | 與java相同:if(a!=null){ a.run();} |
object.also{} | var result = mVar.also {999}躁劣,最終結(jié)果 = 返回一個(gè)mVar對(duì)象給變量result |
object.let{} | var result = mVar.let {999}迫吐,最終結(jié)果 = 返回999給變量result |
object?.let { context -> | 去掉默認(rèn)的it,定義名字為context |
object.?.let | 與java相同:if(a!=null){ a.run();} |
object?.let {//非空時(shí)怎么寫(xiě)} ?: let {//為空又怎么寫(xiě)} | 判斷object非空和為空的邏輯處理 |
object.apply{} | 內(nèi)聯(lián)擴(kuò)展,返回object自身 |
companion object | 伴身對(duì)象,kotlin沒(méi)有靜態(tài)static的說(shuō)法账忘,隨之代替的是它志膀,具體相關(guān)使用Kotlin 對(duì)象表達(dá)式和對(duì)象聲明 - 簡(jiǎn)書(shū) (jianshu.com) |
use | 代替了java的try-catch-finally |
arrayOf | 數(shù)組 |
xx in xx | 循環(huán) |
for (index in 1..100) | 輸出1,2鳖擒,3溉浙,4...100 |
for (position in 100 downTo 0) | 倒序排序,輸出100蒋荚,99戳稽,98,97...0 |
vararg | 可變參數(shù)期升,就是類似java的Integer... rest惊奇,kotlin語(yǔ)句就是vararg rest: Integer,記得使用rest的時(shí)候要在前面加個(gè)*,即是 *rest |
annotation | 注解類 |
arrayOfNulls | 可以用于創(chuàng)建一個(gè)指定大小的播赁、所有元素都為空的數(shù)組 |
@Volatile | 類似@Synchronized颂郎,但是性能優(yōu)于它,使用volatile必須具備以下2個(gè)條件容为,對(duì)變量的寫(xiě)操作不依賴于當(dāng)前值(比如遞增)乓序、該變量沒(méi)有包含在具有其他變量的不變式中 |
check(boolean){} | 如果boolean為false寺酪,拋出異常IllegalStateException |
require(boolean){} | 如果boolean為false,拋出異常IllegalArgumentException |
assert(boolean){} | 如果boolean為false替劈,拋出異常AssertionError |
sealed | 簡(jiǎn)單來(lái)理解就是他是一個(gè)拓展版的枚舉(enum)寄雀,不同之處在于枚舉的實(shí)例是唯一的,而密封類可以有很多實(shí)例抬纸,它們可以有不同的狀態(tài) |
suspend | 是協(xié)程中很重要的關(guān)鍵字咙俩,它用來(lái)修飾函數(shù),表示此函數(shù)是一個(gè)會(huì)掛起的函數(shù)湿故,并且 掛起函數(shù)只有在協(xié)程中使用或者被另一個(gè)掛起函數(shù)調(diào)用阿趁,可以暫停和進(jìn)行恢復(fù) |
注解
關(guān)鍵字 | 注釋 |
---|---|
@JvmStatic | 如果它是函數(shù),則需要從此元素生成額外的靜態(tài)方法坛猪。如果此元素是屬性脖阵,則應(yīng)生成額外的靜態(tài) getter / setter 方法。 |
等價(jià)代碼
作用 | java | kotlin |
---|---|---|
實(shí)例化 | XX xx = new XX() | var xx = XX() |
實(shí)例默認(rèn) | XX xx | var xx : XX |
靜態(tài)變量 | private static final String EXTRA_TITLE = "extra_title" | private val EXTRA_TITLE = "extra_title" |
創(chuàng)建數(shù)組 | new String[]{MediaStore.Images.ImageColumns.DATA} | arrayOf(MediaStore.Images.ImageColumns.DATA) |
數(shù)組類型 | int[] | IntArray |
類型判斷 | !(xx instanceof xx) | !is |
switch | switch(xxx) {case A:break;case B: break;default:break;} | when(xxx) { A -> B-> else -> {} } |
switch | 不根據(jù)某個(gè)變量判斷 | when {isImage() -> {} isVideo() -> else ->{} } |
強(qiáng)制轉(zhuǎn)換 | (類型)xxxxx代碼 | xxxx代碼 as 類型 |
強(qiáng)制轉(zhuǎn)換2 | (類型)xxxxx代碼 | xxx.toLong() |
或運(yùn)算 | a |= b | a = a or b |
internal 適用于內(nèi)部類使用墅茉,如果內(nèi)部類僅僅使用private命黔,就只能內(nèi)部類自己訪問(wèn) | internal fun xx() | |
internal 限制了跨 module 的方法的使用 | static final class | internal class |
internal inner 類似java的內(nèi)部類,加上inner才可以使用外部變量 | class xx | internal inner class |
接口 | public interface xxx | interface xxx |
字符串格式化就斤,目前Kotlin還沒(méi)有悍募,只能用java的 | String.format | java.lang.String.format |
范圍判斷 | i>=min && i <=max | i in min..max |
范圍判斷2 | i>=min && i<max | i in min until max |
for數(shù)組循環(huán) | for (int i = 0; i < max; i++) | i in 0 until max |
for對(duì)象循環(huán) | for (XXXX item : list) | for (item in list) |
for相反順序循環(huán) | for (int i = list.size() - 1; i >= 0; i--) | for (i in list.indices.reversed()) 或 for (i in (0 until childCount).reversed()) |
在方法參數(shù)里面new對(duì)象 | ThreadUtils.executeByIo(new ThreadUtils.BaseSimpleBaseTask<XX>(){}) | ThreadUtils.executeByIo(object : BaseSimpleBaseTask<XX>(){}) |
調(diào)用類自身 | XXXXX.this | this@XXXXX |
三次元運(yùn)算符 | xx == null ? a : b | xx?.toLong() ?: -1 |
內(nèi)部類 | class myWebChromeClient : WebChromeClient() { | private val myWebChromeClient: WebChromeClient = object : WebChromeClient() { |
創(chuàng)建數(shù)組的幾種方法
val asc1 = arrayOf(1, 2, 4)
val asc2 = arrayOfNulls<Int>(3)
asc2[0] = 1
asc2[1] = 2
asc2[2] = 4
val asc3 = Array(3){ i -> i + 1 }
val asc4 = intArrayOf(1, 2, 4)
val asc5 = IntArray(1){ i -> i + 1}
集合
fun main() {
var mutableMap = mutableMapOf<Int, String>()
mutableMap[1] = "a"
mutableMap[0] = "b"
mutableMap[1] = "c"
println(mutableMap)
var mutableList = mutableListOf<Int>()
mutableList.add(1)
mutableList.add(0)
mutableList.add(1)
println(mutableList)
var mutableSet = mutableSetOf<Int>()
mutableSet.add(1)
mutableSet.add(0)
mutableSet.add(1)
println(mutableSet)
}
輸出
{1=c, 0=b}
[1, 0, 1]
[1, 0]
協(xié)程關(guān)鍵字
作用 | kotlin |
---|---|
切換默認(rèn)的UI線程 | viewModel.viewModelScope.launch |
切換默認(rèn)的子線程 | viewModel.viewModelScope.launch(Dispatchers.IO) |
子線程代碼跑完自動(dòng)走ui線程 | withContext(Dispatchers.IO) |
掛起當(dāng)前協(xié)程 | suspendCancellableCoroutine 函數(shù)會(huì)掛起當(dāng)前協(xié)程,并給出一個(gè) continuation 對(duì)象洋机;直到調(diào)用 continuation.resume 恢復(fù)協(xié)程坠宴,或者拋出異常 |