最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

kotlin Standard中的內(nèi)聯(lián)函數(shù)示例詳解

 更新時間:2019年08月12日 09:19:28   作者:白瑞德  
這篇文章主要給大家介紹了關(guān)于kotlin Standard中內(nèi)聯(lián)函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用kotlin具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

let、with、run、apply、also、takeIf、takeUnless、repeat函數(shù)的使用

kotlin Standard.kt文件中,提供了一些內(nèi)聯(lián)函數(shù),這些內(nèi)聯(lián)函數(shù)可以減少代碼量,在使代碼優(yōu)美的同時,打打提高開發(fā)效率。它們分別為:

run、with、let、also、apply

let

let函數(shù)的定義如下:

public inline fun <T, R> T.let(block: (T) -> R): R = block(this)

默認(rèn)當(dāng)前這個對象作為閉包的it參數(shù),函數(shù)接受一個lambda函數(shù)塊返回值是函數(shù)里面最后一行,或者指定return
let函數(shù)的一般結(jié)構(gòu)為:

obj.let {
 it.todo//it指代obj對象實例
 ...
}
//在需要判斷obj是否為null時
obj?.let {
 it.todo//it指代obj對象實例
 ...
}

使用實例:初始化user

 val user = User()
 val result= user.let {
   it.account = "12306"
   it.address = "粵海街道"
   it.address
}
println(result)
//運行結(jié)果
>>粵海街道

適用場景:

  • 用let函數(shù)處理需要針對一個可null的對象統(tǒng)一做判空處理
  • 明確一個變量所在特定作用域的范圍

with

with函數(shù)的定義如下:

public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()

with函數(shù)不是以擴展函數(shù)的形式存在,它是將對象作為參數(shù),在函數(shù)塊內(nèi)通過this指代該對象。with函數(shù)是接收了兩個參數(shù),分別為對象receiver和一個lambda函數(shù)塊,返回值為函數(shù)塊的最后一行或指定return表達(dá)式。
with的一般結(jié)構(gòu)為:

with(obj){
  this.todo
  todo//this可省略
  ...
}

使用實例:將地址影射到UI上

with(user){
 tView.text = address
}

適用范圍:

適用于調(diào)用一個類的多個方法,可以省去對象名直接調(diào)用方法(例如將數(shù)據(jù)影射到ui上時)

run

run函數(shù)的定義如下:

public inline fun <T, R> T.run(block: T.() -> R): R = block()

run函數(shù)接受一個lambda函數(shù)塊,以閉包的形式返回函數(shù)塊的最后一行或指定return表達(dá)式。觀察函數(shù)的定義可以發(fā)現(xiàn),run函數(shù)為一個擴展函數(shù),而其接受的參數(shù)和with函數(shù)第二個參數(shù)相同,run函數(shù)可以理解為let函數(shù)和with函數(shù)的結(jié)合體。
run函數(shù)的一般結(jié)構(gòu)為:

obj.run {
  this.todo
  todo//this可省略
  ...
}

使用實例:將地址影射到UI上

user.run {
 tView.text = address
}

適用范圍:

適用于let和run函數(shù)的場景,run函數(shù)相較于let函數(shù)省去了必須適用it指代參數(shù)的麻煩,相較于with函數(shù)彌補了對象判空的問題

also

also函數(shù)的定義如下:

public inline fun <T> T.also(block: (T) -> Unit): T { block(this); return this }

also函數(shù)的定義和let函數(shù)的類似,只是also函數(shù)返回的為傳入對象的本身。

also函數(shù)的一般結(jié)構(gòu)和使用方法和let函數(shù)類似:

obj.also {
  it.todo//it指代obj對象實例
  ...
}
//在需要判斷obj是否為null時
obj?.let {
  it.todo//it指代obj對象實例
  ...
}

適用范圍:

also函數(shù)返回值微傳入方法的對象本身,所以可用來進(jìn)行函數(shù)的鏈?zhǔn)秸{(diào)用

apply

apply函數(shù)的定義如下:

public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }

apply函數(shù)的定義和run函數(shù)的類似,唯一的區(qū)別就是apply函數(shù)返回的為傳入對象的本身。

apply函數(shù)一般結(jié)構(gòu)如下:

apply函數(shù)一般結(jié)構(gòu)如下:
obj.apply {
  this.todo
  todo//this可省略
  ...
}

使用實例:給對象賦值

var user = User().apply {
      account = "12306"
    }

適用場景:

apply函數(shù)和run函數(shù)除了返回值外,整體功能和作用類似,一般用于對象初始化時對屬性進(jìn)行賦值。

總結(jié):

這里我們總結(jié)對比一下這五個函數(shù),這五個函數(shù)的特性非常簡單,區(qū)別也無非是接受的參數(shù)和返回的類型不同。其中,對于with,run,apply接收者是this(可以省略),而let和also則使用it接受且不可s省略對于;

對于with,run,let返回值是返回值是函數(shù)里面最后一行,或者指定return,而apply和also返回值是調(diào)用者本身。

函數(shù)名 接受者 返回值
let it 最后一行
with this 最后一行
run this 最后一行
also it 調(diào)用者本身
apply this 調(diào)用者本身

如何選擇可以參考下圖

takeIf、takeUnless、repeat

takeIf & takeUnless

takeIf函數(shù)的定義如下:

public inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? = if (predicate(this)) this else null

可以看出:takeIf函數(shù)接受一個入?yún)㈩愋蜑檎{(diào)用者的類型T,返回值為Boolean類型的lambda函數(shù)塊。takeIf函數(shù)根據(jù)lambda函數(shù)返回值返回的數(shù)據(jù),為true返回調(diào)用者本身,否則返回null

takeUnless函數(shù)的定義如下:

public inline fun <T> T.takeUnless(predicate: (T) -> Boolean): T? = if (!predicate(this)) this else null

不難看出,takeUnless相對比takeIf只是在返回值調(diào)用predicate(this)進(jìn)行了取反操作,takeUnless的作用效果和takeIf正好相反!

takeIf函數(shù)一般結(jié)構(gòu)如下:

obj.takeIf{
  ...
  true/fals
}

使用實例:

//根據(jù)age為user賦值,若age在1-100之間,為user.age賦值age,否則user.age為null
var age
...
user.age = age.takeIf { 
  age in 1..99
}.toString()

user.age = age.ta { 
  age in 100..0
}.toString()

repeat

repeat函數(shù)的定義如下:

public inline fun repeat(times: Int, action: (Int) -> Unit) { for (index in 0 until times) { action(index) } }

函數(shù)接受一個int類型數(shù)據(jù)times,和一個入?yún)閕nt類型,無返回值的lambda函數(shù)action,并通過for循環(huán)重復(fù)的調(diào)用times次action函數(shù)

函數(shù)的一般結(jié)構(gòu)如下:

repeat(int){
  todo
}

使用實例:

//快速的為list添加十條數(shù)據(jù)
var list = ArrayList<User>()
repeat(10){
  list.add(User())
}

適用場景:該函數(shù)可以用來避免寫循環(huán)語句,可以用來遍歷數(shù)據(jù)。

結(jié)語:

Kotlin Standard.kt中的標(biāo)準(zhǔn)庫函數(shù)已基本講解完畢,其中涉及到了高階函數(shù)和lambda函數(shù),相關(guān)知識可通過官方文檔學(xué)習(xí),同時建議讀者將每個函數(shù)都實際敲一遍,并通過查看他們編譯后的class文件加深對函數(shù)的理解。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Android實現(xiàn)簡易記事本

    Android實現(xiàn)簡易記事本

    這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)簡易記事本,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android NDK開發(fā)(C語言基本數(shù)據(jù)類型)

    Android NDK開發(fā)(C語言基本數(shù)據(jù)類型)

    這篇文章主要介紹了Android NDK開發(fā)中,C語言基本數(shù)據(jù)類型,主要以C語言包含的數(shù)據(jù)類型及基本類型展開相關(guān)資料,需要的朋友可以參考一下
    2021-12-12
  • 詳解有關(guān)Android截圖與錄屏功能的學(xué)習(xí)

    詳解有關(guān)Android截圖與錄屏功能的學(xué)習(xí)

    這篇文章主要介紹了詳解有關(guān)Android截圖與錄屏功能的學(xué)習(xí),詳細(xì)介紹如何使用MediaProjection,MediaCodec以及MediaMuxer來實現(xiàn)簡單的截屏和錄屏功能。
    2017-04-04
  • Android ScrollView無法填充滿屏幕的解決辦法

    Android ScrollView無法填充滿屏幕的解決辦法

    這篇文章主要介紹了Android ScrollView無法填充滿屏幕的解決辦法的相關(guān)資料,這里提供實例和解決辦法,需要的朋友可以參考下
    2017-07-07
  • Android編程實現(xiàn)簡單流量管理功能實例

    Android編程實現(xiàn)簡單流量管理功能實例

    這篇文章主要介紹了Android編程實現(xiàn)簡單流量管理功能的方法,結(jié)合實例形式分析了Android實現(xiàn)流量監(jiān)控所涉及的功能模塊與布局技巧,需要的朋友可以參考下
    2016-02-02
  • Android實現(xiàn)View滑動效果的6種方法

    Android實現(xiàn)View滑動效果的6種方法

    這篇文章主要介紹了Android實現(xiàn)View滑動的6種方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Android實現(xiàn)顯示和隱藏密碼功能的示例代碼

    Android實現(xiàn)顯示和隱藏密碼功能的示例代碼

    在前端中我們知道用javascript就可以可以很容易實現(xiàn)密碼的顯示與隱藏,本文將大家詳細(xì)介紹Android是如何實現(xiàn)顯示和隱藏密碼功能的,需要的可以參考一下
    2022-06-06
  • Android 快速搭建FTP服務(wù)器的方法

    Android 快速搭建FTP服務(wù)器的方法

    這篇文章主要介紹了Android如何搭建FTP服務(wù)器,需要的朋友可以參考下
    2017-08-08
  • 如何利用Kotlin實現(xiàn)極簡回調(diào)

    如何利用Kotlin實現(xiàn)極簡回調(diào)

    這篇文章主要給大家介紹了關(guān)于如何利用Kotlin實現(xiàn)極簡回調(diào)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • Android Zxing二維碼掃描圖片拉伸的解決方法

    Android Zxing二維碼掃描圖片拉伸的解決方法

    這篇文章主要為大家詳細(xì)介紹了Android Zxing二維碼掃描圖片拉伸的解決方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06

最新評論

城步| 叙永县| 许昌县| 读书| 和林格尔县| 昭平县| 东兴市| 安福县| 余江县| 荃湾区| 嵊州市| 尉犁县| 屏东市| 郯城县| 从化市| 柳江县| 民丰县| 临洮县| 玉门市| 二手房| 鲜城| 祥云县| 钟山县| 松滋市| 浮梁县| 赣州市| 卢龙县| 罗平县| 平凉市| 六枝特区| 武功县| 田林县| 抚顺市| 桑日县| 弥勒县| 镇赉县| 尼木县| 遂溪县| 互助| 新余市| 隆昌县|