亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Kotlin中標準函數run、with、let、also與apply的使用和區別詳解

2024-07-21 23:03:44
字體:
來源:轉載
供稿:網友

前言

和Java相比,在Kotlin中提供了不少新的特性。這次我們就來聊一聊Kotlin的一些通用的擴展標準函數run,with,let,also和apply。對于這五個標準函數它們都存在于Kotlin的源碼標準庫當中,也就是在Standard.kt文件當中。它們都是適用于任何對象的通用擴展函數。但是對于run,with,let,also和apply這五個函數他們的用法及其相似,以至于我們無法確定去選擇使用哪一個。那么現在我們就來聊一下這五個函數它們的使用方法,它們的不同之處以及在什么場景下去使用。

作用域函數

在這里我們重點是看一下run,with,T.run,T.let,T.also,和T.apply,對于這幾個函數來說它們最重要的功能之一是在調用函數的內部又提供了一個作用域。

那么下面就通過一段代碼來看一下run函數的作用域,對于其它函數來說當然也是類似。

fun test(){ var animal = "cat" run {  val animal = "dog"  println(animal) // dog } println(animal)  //cat}

在這個簡單的test函數當中我們擁有一個單獨的作用域,在run函數中能夠重新定義一個animal變量,并且它的作用域只存在于run函數當中。

目前對于這個run函數看起來貌似沒有什么用處,但是在run函數當中它不僅僅只是一個作用域,他還有一個返回值。他會返回在這個作用域當中的最后一個對象。

例如現在有這么一個場景,用戶領取app的獎勵,如果用戶沒有登錄彈出登錄dialog,如果已經登錄則彈出領取獎勵的dialog。我們可以使用以下代碼來處理這個邏輯。

run { if (islogin) loginDialog else getAwardDialog}.show()

可以看到上面這段代碼會變得更加的簡潔,并且可以將show方法一次應用到上面兩個dialog當中,而不是去調用兩次。

with和其它通用標準函數

在這里之所以將with函數單獨拿出來進行說明,是因為with得用法和其它通用的標準函數的用法比較獨特。在這里我們依然使用run函數來進行對比。對于下面這段代碼做的是同樣一件事。它們的不同之處就是一個使用了with(T)函數,而另一個則是使用了T.run函數。

with(webView.settings){ javaScriptEnabled = true databaseEnabled = true}webView.settings.run {  javaScriptEnabled = true databaseEnabled = true}

但是我們覺得使用哪一個會更好呢?現在假設一種場景,那就是webView.settings可能為null。那我們就來再次看一下下面這段代碼.

with(webView.settings){ javaScriptEnabled = true databaseEnabled = true}webView.settings?.run {  javaScriptEnabled = true databaseEnabled = true}

這么以來就很明顯了,當然是T.run方法會更好,因為我們可以在使用這些函數之前可以進行對null的檢查。

對于with也是存在一個返回值,它也是會返回在這個作用域當中的最后一個對象。

作用域中接收者this和it

在這幾個擴展函數當中,它們都能直接獲取到調用的對象或者是with中傳入參數的對象。在這五個擴展函數在它們的作用域中的接收者可以是this或者是it。那么我們來對比一下T.run和T.let函數。這兩個函數也是十分的相似。

stringVariable?.run { println("字符串的長度為$length")}stringVariable?.let { println("字符串的長度為 ${it.length}")}

在這兩段代碼中可以清晰的看到。在T.run函數中通過this來獲取stringVariable對象,而在T.let函數中通過it來取出stringVariable對象。當然我們也能夠為it重新命名。如果我們不想覆蓋外部作用域的this,這時候去使用T.let會更加的方便。至于哪些函數的接收者是this,哪些函數的接收者是it,在后面會通過一張樹狀圖清晰的體現出來。

在作用域中返回值的類型

在這些作用域中它們都會存在一個返回值。在上面的講述的run,with,T.run,T.let中它們返回的都是作用域中最后一個對象。當然它們所返回的值是允許和接受者it或者this對象的類型不同。但是并不是所有的標準函數都是返回作用域的最后一個對象。例如T.also函數。

val original = "abc"original.let { println("The original String is $it") // "abc" it.reversed() }.let { println("The reverse String is $it") // "cba" it.length }.let { println("The length of the String is $it") // 3}original.also { println("The original String is $it") // "abc" it.reversed() }.also { println("The reverse String is ${it}") // "abc" it.length }.also { println("The length of the String is ${it}") // "abc"}

從上面兩段代碼可以看出T.let和T.also的返回值使不同的。T.let返回的是作用域中的最后一個對象,它的值和類型都可以改變。但是T.also不管調用多少次返回的都是原來的original對象。

對于T.let和T.also都能夠進行鏈式操作,那么我們現在結合一下T.let和T.also的鏈式調用來看一下在實際場景中的應用。

//原始函數fun makeDir(path: String): File { val result = File(path) result.mkdirs() return result}//通過let和also的鏈式調用改進后的函數fun makeDir(path: String) = path.let{ File(it) }.also{ it.mkdirs() }

擴展函數的特性

到目前為止除了T.apply沒有使用到以外,根據上面的用法我們可以總結出來這些標準函數的三大特性。

  • 它們都有自己的作用域
  • 它們作用域中的接收者是this或者it
  • 它們都有一個返回值,返回最后一個對象(this)或者調用者自身(itself)

由此可想到對于T.apply無非也就是這三個特性。對于T.apply它作用域中的接收者是this,并且返回的調用者T。因此,T.apply的其中一個使用場景可以用來創建一個Fragment,代碼如下所示:

// 使用普通的方法創建一個Fragmentfun createInstance(args: Bundle) : MyFragment { val fragment = MyFragment() fragment.arguments = args return fragment}// 通過apply來改善原有的方法創建一個Fragmentfun createInstance(args: Bundle)     = MyFragment().apply { arguments = args }

我們也能夠通過T.apply的鏈式調用創建一個Intent:

// 普通創建Intent方法fun createIntent(intentData: String, intentAction: String): Intent { val intent = Intent() intent.action = intentAction intent.data=Uri.parse(intentData) return intent}// 通過apply函數的鏈式調用創建Intentfun createIntent(intentData: String, intentAction: String) =  Intent().apply { action = intentAction }    .apply { data = Uri.parse(intentData) }

如何選擇使用

在這里我們通過一個樹狀圖來看一下對著五個標準函數的區別,使用以及如何選取標準函數(圖片來源于參考文獻當中)

kotlin,also,apply,run,let

總結

在這里做一下總結,我們可以看出在這五個通用標準函數當中它們的特性也是十分的簡單,無非也就是接收者和返回值的不同。對于with,T.run,T.apply接收者是this,而T.let和T.also接受者是it;對于with,T.run,T.let返回值是作用域的最后一個對象(this),而T.apply和T.also返回值是調用者本身(itself)。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到kotlin教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人欧美在线观看| 久久久91精品国产一区不卡| 91色在线视频| 欧美日韩另类视频| 精品人伦一区二区三区蜜桃免费| 亚洲毛片在线免费观看| 国产91精品最新在线播放| 国产精品视频精品| 日本a级片电影一区二区| 亚洲图中文字幕| 国产91精品久久久| 亚洲欧洲成视频免费观看| 日韩精品中文字幕在线播放| 97在线视频观看| 在线观看国产精品淫| 欧美激情一二三| 亚洲国产精品久久91精品| 久久视频在线视频| 亚洲激情视频网站| 美女扒开尿口让男人操亚洲视频网站| 欧美成人剧情片在线观看| 欧美午夜激情视频| 国产精品久久久久久av| 97精品国产aⅴ7777| 亚洲欧美视频在线| 555www成人网| 欧美高清在线视频观看不卡| 亚洲午夜国产成人av电影男同| 中日韩午夜理伦电影免费| 欧美性极品少妇精品网站| 欧美激情奇米色| 亚洲国产精品va在线看黑人动漫| 狠狠操狠狠色综合网| 国产精品免费视频xxxx| 国产精品7m视频| 亚洲国产精品99久久| 日韩欧美在线视频免费观看| 第一福利永久视频精品| 欧美黄色免费网站| 欧美日韩中文字幕综合视频| 亚洲黄色片网站| 美日韩精品免费观看视频| 欧美日韩精品中文字幕| 欧美体内谢she精2性欧美| 日韩精品视频在线播放| 欧美亚洲视频在线看网址| 7777精品视频| wwwwwwww亚洲| 国产精品影院在线观看| 中日韩美女免费视频网站在线观看| 国产精品免费久久久久久| 欧美日韩电影在线观看| 欧美成人精品一区二区| 92版电视剧仙鹤神针在线观看| 日韩电影视频免费| 91精品国产高清久久久久久| 色一区av在线| 91精品视频播放| 欧美性猛交xxxxx水多| 欧美成人在线影院| 91在线免费视频| 日韩免费av片在线观看| 国产成人精品av在线| 亚洲国产毛片完整版| 成人午夜一级二级三级| 欧美视频一区二区三区…| 久久免费视频这里只有精品| 精品人伦一区二区三区蜜桃网站| 亚洲精品一区二区在线| 欧美日韩亚洲一区二区| 欧美高清一级大片| 日本午夜在线亚洲.国产| 亚洲精品www久久久| 久久夜色精品国产亚洲aⅴ| 久久在精品线影院精品国产| 国产精品尤物福利片在线观看| 黄色一区二区三区| 国产亚洲精品美女久久久久| 国产一区红桃视频| 国产精品视频免费在线观看| 久久成人这里只有精品| 日韩网站在线观看| 亚洲一区中文字幕| 97超碰国产精品女人人人爽| 国产精品视频99| 九九久久久久99精品| 国产欧美精品一区二区三区-老狼| 日本久久久久久久久久久| 欧美激情xxxxx| 动漫精品一区二区| 国产精品高清在线观看| 97免费视频在线| 伊人亚洲福利一区二区三区| 久久69精品久久久久久久电影好| 亚洲成人网av| 欧美黑人视频一区| 日韩美女在线观看| 美女av一区二区三区| 国产精品黄色影片导航在线观看| 欧美性猛交xxxx免费看| 国内精品久久久久久久久| 97香蕉久久超级碰碰高清版| 久久综合网hezyo| 国产99久久精品一区二区| 国产91网红主播在线观看| 久久精品国产亚洲精品2020| 奇米成人av国产一区二区三区| 疯狂做受xxxx欧美肥白少妇| 欧美国产高跟鞋裸体秀xxxhd| 国产激情视频一区| 亚洲香蕉av在线一区二区三区| 成人久久一区二区三区| 国产精选久久久久久| 日韩av影视在线| www.欧美视频| 日韩人体视频一二区| 欧美在线视频免费播放| 成人福利网站在线观看| 日韩在线免费av| 日韩美女视频免费看| 日韩女在线观看| 久久久av免费| 韩剧1988免费观看全集| 中文字幕亚洲欧美| 欧洲亚洲免费视频| 国产精品黄页免费高清在线观看| 久久天天躁狠狠躁夜夜爽蜜月| 97国产精品人人爽人人做| 久久69精品久久久久久国产越南| 91亚洲精品久久久久久久久久久久| 91亚洲精品久久久久久久久久久久| 欧美重口另类videos人妖| 国产精品久久久av久久久| 国产精品亚洲精品| 日韩黄色在线免费观看| 国模gogo一区二区大胆私拍| 国产91在线播放精品91| 日韩最新中文字幕电影免费看| 欧美疯狂做受xxxx高潮| 久久免费成人精品视频| 国产香蕉精品视频一区二区三区| 国产视频在线观看一区二区| 57pao国产成人免费| 欧美视频在线观看免费| 欧美在线视频在线播放完整版免费观看| 狠狠色狠色综合曰曰| 色琪琪综合男人的天堂aⅴ视频| 国产精品色午夜在线观看| 美女视频久久黄| 国产精品一区专区欧美日韩| 亚洲最新av网址| 韩剧1988在线观看免费完整版| 国产va免费精品高清在线| 亚洲免费小视频| 欧美最猛性xxxxx亚洲精品| 欧美精品在线观看91| 亚洲理论片在线观看| 亚洲成人在线视频播放| 亚洲激情电影中文字幕| 色婷婷av一区二区三区在线观看| 亚洲欧美日韩精品久久奇米色影视| 国产综合在线视频| 国产精品视频资源| 韩国视频理论视频久久|