koltin的常用操作符(參考他人進(jìn)行整理望几,用于個(gè)人筆記)
- 內(nèi)聯(lián)擴(kuò)展函數(shù)之 let
- 內(nèi)聯(lián)擴(kuò)展函數(shù)之 with
- 內(nèi)聯(lián)擴(kuò)展函數(shù)之 apply
- 內(nèi)聯(lián)擴(kuò)展函數(shù)之 run
- 內(nèi)聯(lián)擴(kuò)展函數(shù)之 also
- 內(nèi)聯(lián)擴(kuò)展函數(shù)之 use
一校焦、內(nèi)聯(lián)擴(kuò)展函數(shù)之 let
1. let函數(shù)底層的inline擴(kuò)展函數(shù)+lambda結(jié)構(gòu)
@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R = block(this)
2. let函數(shù)的使用的一般結(jié)構(gòu)
object.let{
it.todo()//在函數(shù)體內(nèi)使用it替代object對(duì)象去訪問其公有的屬性和方法
...
}
//另一種用途 判斷object為null的操作
object?.let{//表示object不為null的條件下庇绽,才會(huì)去執(zhí)行l(wèi)et函數(shù)體
it.todo()
}
3. let函數(shù)適用的場景
- 從源碼let函數(shù)的結(jié)構(gòu)來看它是只有一個(gè)lambda函數(shù)塊block作為參數(shù)的函數(shù),調(diào)用T類型對(duì)象的let函數(shù)师幕,則該對(duì)象為函數(shù)的參數(shù)基矮。在函數(shù)塊內(nèi)可以通過 it 指代該對(duì)象懂版。返回值為函數(shù)塊的最后一行 或指定 return表達(dá)式。
- 使用場景
場景一: 最常用的場景就是使用let函數(shù)處理需要針對(duì)一個(gè)可null的對(duì)象統(tǒng)一做判空處理穿扳。
場景二: 然后就是需要去明確一個(gè)變量所處特定的作用域范圍內(nèi)可以使用。
二浪腐、內(nèi)聯(lián)函數(shù)之with
1. with函數(shù)底層的inline擴(kuò)展函數(shù)+lambda結(jié)構(gòu)
@kotlin.internal.InlineOnly
public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()
2. with函數(shù)使用的一般結(jié)構(gòu)
Object object = new Object()
object.name="張三"
object.age()
// 相比于let 省略了 it 但是使用 最好先判斷非空 object !=null
with(object){
name="張三"
age()
}
3. with函數(shù)的適用的場景
- with函數(shù)和前面的幾個(gè)函數(shù)使用方式略有不同纵揍,因?yàn)樗皇且詳U(kuò)展的形式存在的。它是將某對(duì)象作為函數(shù)的參數(shù)议街,在函數(shù)塊內(nèi)可以通過 this 指代該對(duì)象泽谨。返回值為函數(shù)塊的最后一行 或指定 return表達(dá)式。
- 適用于調(diào)用同一個(gè)類的多個(gè)方法時(shí)特漩,可以省去類名重復(fù)吧雹,直接調(diào)用類的方法即可,經(jīng)常用于Android中RecyclerView中onBinderViewHolder中涂身,數(shù)據(jù)model的屬性映射到UI上
三雄卷、內(nèi)聯(lián)擴(kuò)展函數(shù)之a(chǎn)pply
1. apply函數(shù)的inline+lambda結(jié)構(gòu)
@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }
2. apply函數(shù)使用的一般結(jié)構(gòu)
Object object = new Object()
object.name="張三"
object.age()
// 和with 基本相似 ,但是可以直接 ?. 方式判斷非空
object?.{
name="張三"
age()
}
3. apply函數(shù)的適用場景
- 它返回的值是 對(duì)象本身蛤售。
- apply一般用于一個(gè)對(duì)象實(shí)例初始化的時(shí)候丁鹉,需要對(duì)對(duì)象中的屬性進(jìn)行賦值°材埽或者動(dòng)態(tài)inflate出一個(gè)XML的View的時(shí)候需要給View綁定數(shù)據(jù)也會(huì)用到揣钦,這種情景非常常見。特別是在我們開發(fā)中會(huì)有一些數(shù)據(jù)model向View model轉(zhuǎn)化實(shí)例化的過程中需要用到漠酿。
四冯凹、內(nèi)聯(lián)擴(kuò)展函數(shù)之a(chǎn)pply
1. run函數(shù)的inline+lambda結(jié)構(gòu)
@kotlin.internal.InlineOnly
public inline fun <T, R> T.run(block: T.() -> R): R = block()
2.run函數(shù)使用的一般結(jié)構(gòu)
Object object = new Object()
object.name="張三"
object.age()
// 和with ,apply 基本相似 ,但是可以直接 ?. 方式判斷非空 炒嘲、返回值不一樣
// apply 返回傳入對(duì)象本身宇姚。
object?.{
name="張三"
age()
}
3. run函數(shù)的適用場景
- 適用于let,with函數(shù)任何場景。因?yàn)閞un函數(shù)是let,with兩個(gè)函數(shù)結(jié)合體夫凸,準(zhǔn)確來說它彌補(bǔ)了let函數(shù)在函數(shù)體內(nèi)必須使用it參數(shù)替代對(duì)象浑劳,在run函數(shù)中可以像with函數(shù)一樣可以省略,直接訪問實(shí)例的公有屬性和方法>
- 另一方面它彌補(bǔ)了with函數(shù)傳入對(duì)象判空問題寸痢,在run函數(shù)中可以像let函數(shù)一樣做判空處理呀洲。
五、內(nèi)聯(lián)擴(kuò)展函數(shù)之a(chǎn)lso
1. also函數(shù)的inline+lambda結(jié)構(gòu)
@kotlin.internal.InlineOnly
@SinceKotlin("1.1")
public inline fun <T> T.also(block: (T) -> Unit): T { block(this); return this }
2. also函數(shù)使用的一般結(jié)構(gòu)
object.also{
it.todo()//在函數(shù)體內(nèi)使用it替代object對(duì)象去訪問其公有的屬性和方法
...
}
//另一種用途 判斷object為null的操作
//而also函數(shù)返回的則是傳入對(duì)象的本身
object?.also{//表示object不為null的條件下,才會(huì)去執(zhí)行also函數(shù)體
it.todo()
}
3. also函數(shù)的適用場景
- 和let函數(shù)類似
- 適用于let函數(shù)的任何場景道逗,also函數(shù)和let很像兵罢,只是唯一的不同點(diǎn)就是let函數(shù)最后的返回值是最后一行的返回值而also函數(shù)的返回值是返回當(dāng)前的這個(gè)對(duì)象。一般可用于多個(gè)擴(kuò)展函數(shù)鏈?zhǔn)秸{(diào)用
六滓窍、use 的使用
1. use的用法
//讀取文件方式一
val br = BufferedReader(FileReader("hello.txt")) //打開文件讀取
with(br) { //對(duì)br中的屬性和方法直接進(jìn)行操作
var line: String?
while (true) {
line = readLine() ?: break //讀取一行數(shù)據(jù)卖词,若為空則退出循環(huán)
println(line) //打印讀取的數(shù)據(jù)
}
close() //關(guān)閉文件讀取
}
//讀取文件方式二
BufferedReader(FileReader("hello.txt")).use {
var line: String?
while (true) {
line = it.readLine() ?: break //讀取一行數(shù)據(jù),若為空則退出循環(huán)
println(line) //打印讀取的數(shù)據(jù)
}
}
//讀取文件方式三
println(BufferedReader(FileReader("hello.txt")).readText()) //最簡單的讀取文件的方法
2. use的使用總結(jié)
- 一般使用與文件流的操作吏夯,且不需要 關(guān)閉流 close()