一探颈、標(biāo)準(zhǔn)函數(shù)
標(biāo)準(zhǔn)函數(shù)是指Standard.kt文件中定義的函數(shù)词裤,任何Kotlin代碼都可以自由的調(diào)用所有標(biāo)準(zhǔn)函數(shù)黍判,標(biāo)準(zhǔn)函數(shù)有很多我們這里主要學(xué)習(xí)下幾個(gè)常用的標(biāo)準(zhǔn)函數(shù)。
1.1 apply
apply函數(shù)可看作一個(gè)配置函數(shù)篙梢,你可以傳入一個(gè)接收者顷帖,然后調(diào)用一系列函數(shù)來配置它以便使用,如果提供lambda給apply函數(shù)執(zhí)行渤滞,它會返回配置好的接收者贬墩。
fun main() {
var map = mutableMapOf("帥次" to 18).apply {
put("apply-北京",188)
put("apply-上海",288)
}
println(map)//{帥次=18, apply-北京=188, apply-上海=288}
}
- 1、創(chuàng)建可變Map
- 2妄呕、通過apply()函數(shù)添加數(shù)據(jù)
如下陶舞,咱們啟動一個(gè)界面并傳參
val intent = Intent(this,NextActivity::class.java).apply {
putExtra("name","sc")
putExtra("age",19)
}
startActivity(intent)
可以看到,調(diào)用一個(gè)個(gè)函數(shù)類配置接收者時(shí)绪励,變量名(map肿孵、intent)就省掉了,這是因?yàn)槭栉海趌ambda表達(dá)式里停做,apply能讓每個(gè)配置函數(shù)都作用于接收者,這種行為有時(shí)又叫做相關(guān)作用域大莫,因?yàn)閘ambda表達(dá)式里的所有函數(shù)調(diào)用都是針對接收者的蛉腌,或者說,它們是針對接收者的隱式調(diào)用。
1.2 let
let函數(shù)能使某個(gè)變量作用于其lambda表達(dá)式里烙丛,讓it關(guān)鍵字能引用它舅巷。let與apply比較,let會把接收者傳給lambda河咽,而apply什么都不傳钠右,匿名函數(shù)執(zhí)行完,apply會返回當(dāng)前接收者库北,而let會返回lambda的最后一行爬舰。
var letData = 20.let {
"不知不覺過去 $it 年了"
}
println(letData)
1.3 also
also函數(shù)和let函數(shù)功能相似,和let一樣寒瓦,also也是把接收者作為值參傳給lambda,但有一點(diǎn)不同:also返回接收者對象情屹,而let返回lambda結(jié)果。因?yàn)檫@個(gè)差異杂腰,also尤其適合針對同一原始對象垃你,利用副作用做事,既然also返回的是接收者對象喂很,你就可以基于原始接收者對象執(zhí)行額外的鏈?zhǔn)秸{(diào)用惜颇。
//also
var alsoData = "AndroidSHUAICI"
var strAlso = alsoData.also {
println(it.length)//14
}.also {
println(it.startsWith("Android"))//true
}
println(strAlso)//AndroidSHUAICI
1.4 run
具備接收者的隱式調(diào)用(apply),返回的是lambda的最后一行(let)少辣。
//run
var str = "Android帥次"
var s = str.run {
startsWith("Android")
}
println(s)//true
加強(qiáng)版
fun main() {
var runS = str.run {
startsWith("Android")
println(this)//Android帥次
"吼吼哈嘿"http://這里決定下一個(gè)run的this類型
}.run {
println(this)//吼吼哈嘿
18//這里的18傳入到isAge函數(shù)
}.run(::isAge)
println(runS)//false
}
fun isAge(age: Int) = age > 15
從上面看出凌摄,run支持鏈?zhǔn)秸{(diào)用,run也支持函數(shù)引用漓帅。
1.5 with
with函數(shù)是run的變體锨亏,功能一樣,但是調(diào)用with時(shí)需要值參作為其第一個(gè)參數(shù)傳入忙干。
var strWith = "Android帥次"
var sWith = strWith.run {
startsWith("Android")
"run-$this"
}
println(sWith)//run-Android帥次
sWith = with(strWith) {
startsWith("Android")
"with-$this"
}
println(sWith)//with-Android帥次
1.6 takelf
如果需要判斷某個(gè)條件是否滿足器予,再決定是否可以賦值變量或執(zhí)行某項(xiàng)任務(wù),takelf就非常有用捐迫,概念上講乾翔,takelf函數(shù)類似于if語句,但它的優(yōu)勢是可以直接在對象實(shí)例上調(diào)用施戴,避免了臨時(shí)變量賦值的麻煩反浓。
takelf函數(shù)需要判斷l(xiāng)ambda中提供的條件表達(dá)式,給出true或false結(jié)果:
- 如果判斷結(jié)果是true赞哗,從takelf函數(shù)返回接收者對象勾习。
- 如果是false,則返回null懈玻。
val strTakeIf = "Android帥次"
val tkif = strTakeIf.takeIf {
it.startsWith("Android")//返回true
}
println(tkif)//Android帥次
var tkifS= strTakeIf.takeIf {
it.startsWith("Android")
}.takeIf {
println("Length:${it?.length}")//Length:9
it?.length!! > 20//返回false
}
println(tkifS)//null
1.7 takeUnless
takelf輔助函數(shù)takeUnless巧婶,只有判斷你給定的條件結(jié)果是false時(shí)乾颁,takeUnless才會返回原始接收者對象,跟takelf剛好相反
val strTakeIfUn = "Android帥次"
val un = strTakeIf.takeUnless {
it.startsWith("Android")//返回true
}
println(un)//null
var un2 = strTakeIfUn.takeUnless {
it.startsWith("帥次")//返回false
}
println(un2)//Android帥次
takeUnless函數(shù)有點(diǎn)調(diào)皮艺栈,了解一下就行英岭。還是感覺takelf比較好理解和使用。
下面給大家分享兩份資料:字節(jié)跳動內(nèi)部超高質(zhì)量Kotlin筆記湿右、谷歌大佬編寫高級Kotlin強(qiáng)化實(shí)戰(zhàn)(附Demo)诅妹。
一、字節(jié)跳動內(nèi)部超高質(zhì)量Kotlin筆記
1.準(zhǔn)備開始
- 基本語法
- 習(xí)慣用語
- 編碼風(fēng)格
2.基礎(chǔ)
- 基本類型
- 包
- 控制流
- 返回與跳轉(zhuǎn)
3.類和對象
- 類和繼承
- 屬性和字段
- 接口
- 可見性修飾詞
- 擴(kuò)展
- 數(shù)據(jù)對象
- 泛型
- 嵌套類
- 枚舉類
- 對象表達(dá)式和聲明
- 代理模式
- 代理屬性
4.函數(shù)和lambda表達(dá)式
- 函數(shù)
- 高階函數(shù)與 lambda 表達(dá)式
- 內(nèi)聯(lián)函數(shù)
5.其它
- 多重申明
- Ranges
- 類型檢查和自動轉(zhuǎn)換
- This表達(dá)式
- 等式
- 運(yùn)算符重載
- 空安全
- 異常
- 注解
- 反射
- 動態(tài)類型
6.互用性
- 動態(tài)類型
7.工具
- 使用Maven
- 使用 Ant
- 使用 Gradle
- 使用Griffon
8.FAQ
- 與java對比
- 與Scala對比
基礎(chǔ)知識掌握之后就是靠實(shí)戰(zhàn)提升了毅人!
二吭狡、谷歌大佬編寫高級Kotlin強(qiáng)化實(shí)戰(zhàn)(附Demo)
第一章 Kotlin入門教程
- Kotlin 概述
- Kotlin 與 Java 比較
- 巧用 Android Studio
- 認(rèn)識 Kotlin 基本類型
- 走進(jìn) Kotlin 的數(shù)組
- 走進(jìn) Kotlin 的集合
- 集合問題
- 完整代碼
- 基礎(chǔ)語法
第二章 Kotlin 實(shí)戰(zhàn)避坑指南
- 方法入?yún)⑹浅A浚豢尚薷?/li>
- 不要 Companion 丈莺、INSTANCE 划煮?
- Java 重載,在 Kotlin 中怎么巧妙過渡一下缔俄?
- Kotlin 中的判空姿勢
- Kotlin 復(fù)寫 Java 父類中的方法
- Kotlin “狠”起來弛秋,連TODO 都不放過!
- is俐载、as` 中的坑
- Kotlin 中的 Property 的理解
- also 關(guān)鍵字
- takeIf 關(guān)鍵字
- takeIf 關(guān)鍵字
- 單例模式的寫法
第三章 項(xiàng)目實(shí)戰(zhàn)《Kotlin Jetpack 實(shí)戰(zhàn)》
- 從一個(gè)膜拜大神的 Demo 開始
- Kotlin 寫 Gradle 腳本是一種什么體驗(yàn)蟹略?
- Kotlin 編程的三重境界
- Kotlin 高階函數(shù)
- Kotlin 泛型
- Kotlin 擴(kuò)展
- Kotlin 委托
- 協(xié)程“不為人知”的調(diào)試技巧
- 圖解協(xié)程:suspend
更多Android可以查看我的個(gè)人介紹!6粲丁挖炬!