未完待續(xù)······太監(jiān)直播吃電腦(●'?'●)
一.基礎(chǔ)操作符轰坊、語法冀宴、定義等
val --> 常量 ; var --> 變量
:
繼承、實(shí)現(xiàn)::
引用
fun isOdd(x: Int) = x % 2 != 0
println(numbers.filter(::isOdd)) // 輸出 [1, 3]
=、==聪建、=== 分別表示 賦值钙畔、比值、比引用
is 金麸、!is --> instanceof
$ (取值符)
.. 表示區(qū)間 1..5 --> 1至5
?相關(guān):
val num : Int? = number //標(biāo)識(shí)num允許為null,但是會(huì)將num自動(dòng)裝箱
num?: println("num is null") //?: 在num為null時(shí)
num?.let { println("num not null") } //?.let在num非null時(shí)
- 構(gòu)造函數(shù)constructor
一個(gè)類可以有一個(gè)主構(gòu)造函數(shù)和多個(gè)次構(gòu)造函數(shù)擎析,且主構(gòu)造函數(shù)不能包含任何代碼,代碼僅能置于init塊中:
class Customer constructor(name: String) {
init {
logger.info("Customer initialized with value ${name}")
}
}
通過:this
調(diào)用其它構(gòu)造方法:
constructor(name: String, parent: Person) : this(name)
open 開放類/成員: open 標(biāo)注與 Java 中 final 相反挥下,它允許其他類 繼承這個(gè)類叔锐、重寫某個(gè)方法。默認(rèn)情況下见秽,在 Kotlin 中所有的類都是 final
setter愉烙、getter 的使用:
val isEmpty: Boolean(可以省略類型)
get() = this.size == 0
var name: String
set(value) {
this = value
}
- as類型強(qiáng)轉(zhuǎn)符
fun getMvpView():V{
return this as V
}
- 屬性修飾符
private //自身可見
protected //自身及子類可用
internal //本模塊(module)內(nèi)可用
public //任何客戶端可用
- when的使用
when(tag1){
"a" -> println("a")
"abc" -> println("bb")
is String -> println("string")
else -> println("unknow")
}
- 方法由fun聲明,且類型聲明后置 (方法參數(shù)類型解取、返回值類型等):
val number : Int = 555
fun sum(a: Int, b: Int): Int {
return a + b
}
fun sum(a: Int = 1, b: Int = 2) : Int = a + b
- 允許為方法參數(shù)設(shè)置默認(rèn)值 :
fun sum(a: Int = 1, b: Int = 2): Int {
return a + b
}
- 數(shù)組Array相關(guān):
//創(chuàng)建數(shù)組
val myAray = arrayOf(1,2,3)
val myArrat = Array(3,{i -> i })
//遍歷
for (s in myAray)
println(s)
- List:
val list = listOf<String>("a","b","c")
val list1 = List(3,{i -> i })
list.filter { s -> s != "a" } //過濾
list.map { s -> s+"@" } //變化
- 對(duì)象聲明 object關(guān)鍵字后加對(duì)象管理者名稱
object Hero {
fun getInstance() : Hero {
return Hero()
}
}
Hero.getInstance()
伴生對(duì)象 companion object關(guān)鍵字聲明
匿名對(duì)象的創(chuàng)建(方便的是匿名對(duì)象訪問外部變量時(shí)不必再去申明final類型了):
val noName= object {
var x: Int = 0
var y: Int = 0
}
- 單例
object Singletons {
val something: OfMyType by lazy() { ... }
val somethingLazyButLessSo: OtherType = OtherType()
val moreLazies: FancyType by lazy() { ... }
}
- by lazy{} 只能用在val類型, lateinit 只能用在var類型
二.函數(shù)步责、Lambda、代碼分析
- 1.函數(shù)擴(kuò)展:為某個(gè)類定義一個(gè)擴(kuò)展函數(shù)禀苦,使得在任何地方都可以通過對(duì)象.函數(shù)名的方式去調(diào)用改函數(shù)蔓肯。(簡(jiǎn)化了通過extend創(chuàng)建子類)
常見的使用場(chǎng)景就是拓展Context類,增加一個(gè)showToast的簡(jiǎn)單方法振乏,避免每次show Toast的大量重復(fù)代碼蔗包,:
fun Context.showToast(message:String = "this is a toast",length : Int = Toast.LENGTH_SHORT){
Toast.makeText(this,message,length)
}
如果一個(gè)類定義有一個(gè)成員函數(shù)和一個(gè)擴(kuò)展函數(shù),而這兩個(gè)函數(shù)又有相同的接收者類型慧邮、相同的名字 并且都適用給定的參數(shù)调限,這種情況總是取成員函數(shù)。 例如:
class C {
fun foo() { println("member") }
}
fun C.foo() { println("extension") }
如果我們調(diào)用 C 類型 c的 c.foo()误澳,它將輸出“member”耻矮,而不是“extension”。
- 2.屬性擴(kuò)展 (布能直接初始化忆谓,只能通過setter裆装、getter):
val <T> List<T>.lastIndex: Int
get() = size - 1
3.copy()函數(shù),可以理解為拷貝一個(gè)對(duì)象倡缠,僅改變其部分成員值
4.函數(shù)的命名參數(shù)(當(dāng)函數(shù)有默認(rèn)參數(shù)值時(shí)哨免,我們可以通過命名參數(shù)的方式,指定某幾個(gè)參數(shù)的值昙沦,而其他參數(shù)仍采用默認(rèn)值):
fun goEasy(name : String = "me",
time : String = "now",
isShow: Boolean = true): Unit{}
goEasy() //使用默認(rèn)參數(shù)
goEasy(name = "axe",isShow = false) //命名參數(shù)
- 5.vararg可變數(shù)量的參數(shù),動(dòng)態(tài)參數(shù)琢唾,省去了重載:
fun <T> asList(vararg ts: T): List<T> {
val result = ArrayList<T>()
for (t in ts) // ts is an Array
result.add(t)
return result
}
- 6.函數(shù)作用域:
全局函數(shù),在kt文件中申明桅滋,可以在全局使用慧耍;
成員函數(shù),類中申明丐谋;
內(nèi)部函數(shù)芍碧,在函數(shù)內(nèi)部還可以申明函數(shù),并可以訪問父外部函數(shù)的變量号俐,可以參考匿名內(nèi)部類
- 7.高階函數(shù)泌豆,函數(shù)的參數(shù)是另一個(gè)函數(shù)體(一般傳一個(gè)lambda表達(dá)式,必須制定參數(shù)類型和返回值類型):
fun <T> lock(lock: Lock, body: () -> T): T {
lock.lock()
try {
return body()
}
finally {
lock.unlock()
}
}
val result = lock(lock, { sharedResource.operation() })
- 8.Lambda相關(guān):
lambda 表達(dá)式總是被大括號(hào)括著
其參數(shù)(如果有的話)在 -> 之前聲明(參數(shù)類型可以省略)
函數(shù)體(如果存在的話)在 -> 后面
如果函數(shù)字面值只有一個(gè)參數(shù), 那么它的聲明可以省略(連同 ->),其名稱是 it
ints.map { it->(省略)it * 2 }
- 9.告別findViewById,可以直接把控件的id當(dāng)作其實(shí)例使用吏饿,但是前提:
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
import kotlinx.android.synthetic.main.activity_read_detail.*;
headText.text = "放開我~你就能刷新了哦(●'?'●)"
headText.gravity = Gravity.CENTER
- 10.with()擴(kuò)展函數(shù):在with代碼塊中我們可以使用this和直接訪問所有的public的方法和屬性
inline fun <T> with(t: T, body: T.() -> Unit) { t.body() }
with(A){
A.method();
A.field;
}