網站首頁 編程語言 正文
這里我們將介紹Kotlin 5個作用域函數:let,run,with,apply,also。
1 let
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() }
2 run
與 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 } }
3 with
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 }
4 apply
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) }
5 also
類似 let 函數,但區別在于返回值:
- let 函數:返回值 = 最后一行 / return的表達式
- also 函數:返回值 = 傳入的對象的本身
// 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) }
原文鏈接:https://blog.csdn.net/zyctimes/article/details/127814513
相關推薦
- 2023-01-31 GraphQL在Django中的使用教程_python
- 2022-06-21 C語言字符串函數與內存函數精講_C 語言
- 2021-12-11 Linux環境變量和進程地址空間介紹_Linux
- 2021-11-25 Linux命令unzip詳解_Linux
- 2021-12-01 Android之小球自由碰撞動畫示例_Android
- 2022-09-07 python?正則表達式如何實現重疊匹配_python
- 2021-11-28 C/C++中的?Qt?StandardItemModel?數據模型應用解析_C 語言
- 2022-05-05 Python學習之列表常用方法總結_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支