<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
apply函數可以看做是一個設定函數。針對apply函數的呼叫者做一些設定,並把呼叫者返回。
範例:下面apply的呼叫者是file,呼叫完之後,返回的還是file,並在apply函數中,針對file做了一些設定。
val file = File("d:\hello.txt").apply { setWritable(true) setReadable(true) setExecutable(false) }
apply原始碼分析:
1)apply 用inline修飾,是一個行內函式。
2)定義了一個<T>泛型,T.apply 呼叫者就是T,:T apply返回的型別也是T
上面的file就相當於T
3)再看apply的引數:block: T.() -> Unit。這是一個匿名函數,T.()->說明接收的是T的函數返回的是Unit型別。
4)在apply內部 呼叫了這個匿名函數block()也就是T的
5)return this,就是apply 的返回值,返回的是當前呼叫apply函數的物件。
public inline fun <T> T.apply(block: T.() -> Unit): T { block() return this }
let函數會把呼叫者作為引數傳到lambda表示式裡,可以用it來代替它使用。函數執行完畢,lambda表示式返回的結果,就是let函數返回的結果。
val hello = "Hello world".let { it.replace("world","kotlin") } //列印結果 Hello kotlin println(hello)
看下let函數的定義:
1)let函數也是一個行內函式。
2)定義了兩個泛型<T,R> T.let(),說明T是let的呼叫者。
3)block: (T) -> R 說明let接收的是一個匿名函數,匿名函數的引數是T,返回值是R
4): R 說明let函數的返回在也是R,也就是定義的匿名函數的返回值。
5)return block(this) 把當前呼叫者當做引數傳進來,lambda執行結果返回
上面的範例,呼叫let後,會把呼叫者當做引數傳遞到匿名函數也就是lambda中,並把lambda的執行結果,當做是let的結果返回。
inline fun <T, R> T.let(block: (T) -> R): R { return block(this) }
run函數和apply差不多,可以給呼叫者做設定。唯一的差別是apply返回的是當前呼叫者物件,而run返回的是lambda執行的結果。
val text = File("d:\hello.txt").run { setWritable(true) setReadable(true) setExecutable(false) readText() } println(text)
run函數分析:
1)run函數也是一個行內函式。
2)有兩個泛型<T,R>,T是當前呼叫者,R是返回值
3)run接收一個lambda :block: T.() -> R 呼叫T的方法,並且把執行結果返回
4): R lambda的執行結果,就是run函數的執行結果。我們知道lambda預設會把最後一行的結果返回。
5)return block() 返回lambda的執行結果
inline fun <T, R> T.run(block: T.() -> R): R { return block() }
with函數是run的變體,他們的功能是一樣的。唯一的不同是呼叫方式,呼叫with時,第一個引數需要傳入一個值參。
val hello = "Hello World" val h2 = with(hello) { replace("World", "Kotlin") } println(h2)
原始碼分析:
with接收兩個引數,第一個是傳入的值參,第二個是一個lambda表示式。
inline fun <T, R> with(receiver: T, block: T.() -> R): R { return receiver.block() }
also函數和let函數類似,also也是把呼叫者作為引數傳遞給lambda,不同點是let返回的是lambda的執行結果,而also返回的是當前呼叫者物件,這點和apply類似。
這對這個特點,可以實現呼叫者的鏈式呼叫。
舉個簡單列子。
雖然對hello做了substring,但並不會改變hello的初始值。因為最後返回的還是呼叫者物件本身。
val hello = "Hello world".also { println(it.count()) }.also{ println(it.substring(0,5)) } println(hello)
原始碼分析:
block: (T) -> Unit also接收一個lambda,這個lambda把呼叫者T當引數傳進來了,block(this)。
return this 又把當前物件返回回去了。
inline fun <T> T.also(block: (T) -> Unit): T { block(this) return this }
takeIf需要判斷lambda表示式中結果,如果true則返回撥用者物件,如果是false,則返回null。
如果需要判斷某個條件是否滿足,再決定是否可以給變數賦值或執行某項任務時,takeIf就很好用。takeIf類似於if語句。
範例:如果flag為true,則給hello賦值“Hello world”。
如果flag為false,則返回null,但是後面又有一個?:判斷,就會給hello賦值“hello null”
var flag = false val hello = "Hello world".takeIf { false } ?: "hello null" println(hello)
原始碼分析:
從if (predicate(this)) this else null可以看出,如果predicate(this)為true則返回撥用者this否則返回null
inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? { return if (predicate(this)) this else null }
通過原始碼分析,takeIf也會把呼叫者T當做引數傳到lambda中,這樣我們在lambda中就可以針對呼叫者做判斷,滿足某些條件則返回撥用者物件,如果不滿足,則返回null。
val hello = "Hello world".takeIf { it.count() > 15 } ?: "hello kotlin world" println(hello)
takeUnless剛好和takeIf相反,只有給定條件為false時,才會返回takeUnless呼叫者物件,否則返回null。
val hello = "Hello world".takeUnless { it.count() > 15 } ?: "hello kotlin world" println(hello)
原始碼:
if (!predicate(this)) 剛好和takeIf中的相反。
inline fun <T> T.takeUnless(predicate: (T) -> Boolean): T? { return if (!predicate(this)) this else null }
到此這篇關於Kotlin標準庫函數使用分析及介紹的文章就介紹到這了,更多相關Kotlin標準庫函數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45