<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
這裡我們將介紹Kotlin 5個作用域函數:let,run,with,apply,also。
let
可用於範圍界定和空值檢查。在物件上呼叫時,let
執行給定的程式碼塊並返回其最後一個表示式的結果。物件可通過參照它(預設情況下)或自定義名稱在塊內進行存取。
所以,總結起來,let
有如下三大特徵:
// 重點11:使用it替代object物件去存取其公有的屬性 & 方法 object.let{ it.todo() } // 重點2:判斷object為null的操作 object?.let{//表示object不為null的條件下,才會去執行let函數體 it.todo() } // 重點3:返回值 = 最後一行 / return的表示式
下面是一些例子(我們可以直接在 Kotlin Playground 中執行):
fun customPrint(s: String) { print(s.uppercase()) } fun main() { val empty = "test".let { // Calls the given block on the result on the string "test". customPrint(it) // 這裡的 it 就是 "test",所以 "test" 作為輸入給到 customPrint 函數中,列印出大寫的 "test" it.isEmpty() // let 最後返回的是這個,也就是 empty 最終的值是 false } println(" is empty: $empty") // 列印結果 TEST is empty: false。這裡的 TEST 是 customPrint 函數 的列印結果。注意 print 和 println 的區別 fun printNonNull(str: String?) { println("Printing "$str":") str?.let { // object不為null的條件下,才會去執行let函數體 print("t") customPrint(it) println() // 換行。let最後返回的是這一行 } } fun printIfBothNonNull(strOne: String?, strTwo: String?) { strOne?.let { firstString -> strTwo?.let { secondString -> customPrint("$firstString : $secondString") println() } } } printNonNull(null) // 列印 Printing "null": printNonNull("my string") // 列印 Printing "my string": // MY STRING printIfBothNonNull("First","Second") // 列印 FIRST : SECOND }
從另一個方面,我們來比對一下不使用 let 和使用 let 函數的區別。
// 使用kotlin(無使用let函數) mVar?.function1() mVar?.function2() mVar?.function3() // 使用kotlin(使用let函數) // 方便了統一判空的處理 & 確定了mVar變數的作用域 mVar?.let { it.function1() it.function2() it.function3() }
與 let 函數類似,run 函數也返回最後一條語句。另一方面,與 let 不同,執行函數不支援 it 關鍵字。所以,run 的作用可以是:
下面是一些例子:
fun main() { fun getNullableLength(ns: String?) { println("for "$ns":") ns?.run { // 判空處理 println("tis empty? " + isEmpty()) // 這裡我們就發現,在 isEmpty 前不再需要 it println("tlength = $length") length // run returns the length of the given String if it's not null. } } getNullableLength(null) // 列印 for "null": getNullableLength("") // 列印 for "": // is empty? true // length = 0 getNullableLength("some string with Kotlin") // 列印 for "some string with Kotlin": // is empty? false // length = 23 data class People(val name: String, val age: Int) val people = People("carson", 25) people?.run{ println("my name is $name, I am $age years old") // 列印:my name is carson, I am 25 years old } }
with 是一個非擴充套件函數,可以簡潔地存取其引數的成員:我們可以在參照其成員時省略範例名稱。所以說,run 相當於 let 和 with 的集合。
class Configuration(var host: String, var port: Int) fun main() { val configuration = Configuration(host = "127.0.0.1", port = 9000) with(configuration) { println("$host:$port") // 列印 127.0.0.1:9000 } // instead of: println("${configuration.host}:${configuration.port}") // 列印 127.0.0.1:9000 }
apply 對物件執行程式碼塊並返回物件本身。在塊內部,物件由此參照。此函數對於初始化物件非常方便。所以再重複一遍,apply函數返回傳入的物件的本身。
data class Person(var name: String, var age: Int, var about: String) { constructor() : this("", 0, "") } fun main() { val jake = Person() val stringDescription = jake.apply { // Applies the code block (next 3 lines) to the instance. name = "Jake" age = 30 about = "Android developer" }.toString() println(stringDescription) // 列印 Person(name=Jake, age=30, about=Android developer) }
類似 let 函數,但區別在於返回值:
// let函數 var result = mVar.let { it.function1() it.function2() it.function3() 999 } // 最終結果 = 返回999給變數result // also函數 var result = mVar.also { it.function1() it.function2() it.function3() 999 } // 最終結果 = 返回一個mVar物件給變數result
另一個類似的例子:
data class Person(var name: String, var age: Int, var about: String) { constructor() : this("", 0, "") } fun writeCreationLog(p: Person) { println("A new person ${p.name} was created.") } fun main() { val jake = Person("Jake", 30, "Android developer") // 1 .also { // 2 writeCreationLog(it) // 3 } println(jake) // 最終列印: // A new person Jake was created. // Person(name=Jake, age=30, about=Android developer) }
到此這篇關於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