Kotlin 学习笔记08
Lambda作為形參和返回值
聲明高階函數(shù)
- 任何以lambda或者函數(shù)引用作為參數(shù)的函數(shù),或者返回值,或者兩者都有,就是高階函數(shù)。比如list.filter
(4,"abc")-> {} 如下:
{ x, y -> x + y} 這里省略了參數(shù)x,y類型,因為在其他部分已經(jīng)制定了,不需要在lambda函數(shù)體再次聲明
val funOrNull: ((Int, Int) -> Int)? = null 復(fù)制代碼- 可以為函數(shù)參數(shù)制定名字
- 調(diào)用函數(shù)
- filter()函數(shù)
- 在Java中使用函數(shù)類 原理:函數(shù)類型被聲明為普通的接口:一個函數(shù)類型的變量,是FunctionN接口的一個實現(xiàn)。Kotlin標(biāo)準(zhǔn)庫定義了一系列的接口比如 Function0<R>(沒有參數(shù)的函數(shù)),Function1(P1,R)(一個參數(shù)的函數(shù)),調(diào)用這個方法就會執(zhí)行函數(shù)。一個函數(shù)類型的變量就實現(xiàn)了對應(yīng)的FunctionN接口的實現(xiàn)類的實例,實現(xiàn)類invoke方法包含了lambda函數(shù)體
函數(shù)類型的參數(shù)默認(rèn)值和null值
fun <T> Collection<T>.joinToString(separator: String = ", ",prefix: String = "",postfix: String = "" ): String {val result = StringBuilder(prefix)for ((index, value) in this.withIndex()) {if (index > 0) result.append(separator)result.append(value.toString())}result.append(postfix)return result.toString() } 復(fù)制代碼返回函數(shù)的函數(shù)
- 比如運(yùn)輸費(fèi)用依賴于運(yùn)輸方式,可以定義一個函數(shù),用來選擇恰當(dāng)?shù)倪壿嬜凅w,并將它作為一個函數(shù)返回
- eg:通過輸入開頭文字,過濾聯(lián)系人列表
使用lambda去除重復(fù)代碼
val log = listOf(SiteVisit("/", 34.0, OS.WINDOWS),SiteVisit("/", 22.0, OS.MAC),SiteVisit("/", 12.0, OS.WINDOWS),SiteVisit("/sign_up", 8.0, OS.IOS),SiteVisit("/", 16.3, OS.ANDROID)) fun List<SiteVisit>.averageTime(os: OS) = filter { it.os == os }.map { it.duration }.average()//調(diào)用 println(log.averageTime(OS.WINDOWS)) 復(fù)制代碼- 如果說要查詢WINDOW、和Android的呢?后面又需要改成來自iOS的注冊頁面停留時間是多少呢?這個時候lambda就派上用場了。
把過濾條件轉(zhuǎn)換成lambda表達(dá)式,實現(xiàn)去除重復(fù)代碼
策略模式(你需要聲明一個接口,并且為每一種可能實現(xiàn)不同的策略)可以通過lambda簡化
內(nèi)聯(lián)函數(shù):消除lambda運(yùn)行時帶來的開銷
在kotlin中,每創(chuàng)建一個lambda表達(dá)式就會創(chuàng)建一個匿名類,so,每次調(diào)用都會創(chuàng)建一個對象,會帶來額外的開銷這個時候inline就出現(xiàn)了。
一個被inline修飾的函數(shù),函數(shù)體會直接替換到函數(shù)被調(diào)用的地方,而不是正常調(diào)用。一般來說,參數(shù)如果被直接調(diào)用或者作為參數(shù)傳遞給另外一個inline函數(shù)。他是可以被內(nèi)聯(lián)的。
- 內(nèi)聯(lián)函數(shù)使用限制-》不能把內(nèi)聯(lián)函數(shù)保存到一個屬性?
內(nèi)聯(lián)集合操作
Kotlin標(biāo)準(zhǔn)庫中,集合函數(shù),比如filter,map等函數(shù)已經(jīng)inline函數(shù),不會產(chǎn)生額外的對象。在處理比較大的集合,應(yīng)該使用序列asSequence進(jìn)行操作。
怎樣決定是否使用lambda
- 使用inline關(guān)鍵字只能提高帶有l(wèi)ambda參數(shù)的函數(shù)的性能。
- 對于普通函數(shù)JVM已經(jīng)提供了強(qiáng)大的內(nèi)聯(lián)支持。
- 應(yīng)該保證inline修飾的函數(shù)比較小。-》因為需要把函數(shù)字節(jié)碼拷貝到每一個調(diào)用點(diǎn)上。
使用lambda管理資源
通常在資源管理中,需要在try里獲取資源,在finally中釋放資源可以把這一部分封裝成lambda表達(dá)式 在Kotlin中,加鎖使用withLock函數(shù) :try-with-resource 語句
static String readFirstLineFromFile(String path) throws IOException {try (BufferedReader br = new BufferedReader(new FileReader(path))) {return br.readLine();}//這里不需要寫關(guān)閉資源的語句, } 復(fù)制代碼在Kotlin中使用use實現(xiàn)相同的結(jié)果,用于操作可關(guān)閉的資源。
fun readFirstLineFromFile(path: String): String = BufferedReader(FileReader(path)).use { br -> br.readLine() } 復(fù)制代碼高階函數(shù)中的控制流
- 使用return 從一個封閉的函數(shù)中返回。
- 從lambda返回
同樣的規(guī)則也適用于this表達(dá)式
- 匿名函數(shù):默認(rèn)使用局局部返回
在filter中使用匿名函數(shù)
list.filter(fun(person): Boolean {return person.age > 10}) 復(fù)制代碼如果是使用表達(dá)式函數(shù)體,可以省略返回值類型,可以簡化為
list.filter(fun(person) = person.age > 10 ) 復(fù)制代碼End
轉(zhuǎn)載于:https://juejin.im/post/5c3d728af265da61171cf3c3
總結(jié)
以上是生活随笔為你收集整理的Kotlin 学习笔记08的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 叠加代码写法,利用st_g
- 下一篇: 苏嵌点滴(一)