【Kotlin 初学者】标准函数

举报
帅次 发表于 2021/12/28 00:13:30 2021/12/28
【摘要】 作者简介:CSDN博客专家、华为云享专家认证 系列专栏:Kotlin 初学者 学习交流:三人行必有我师焉;择其善者而从之,其不善者而改之。 目录 标准函数 1.1 apply 1.2 let 1.3 also 1.4 run 1.5 with 1.6 takelf 1.7 takeUnless 标...

作者简介:CSDN博客专家、华为云享专家认证

系列专栏:Kotlin 初学者

学习交流:三人行必有我师焉;择其善者而从之,其不善者而改之。

目录

标准函数

1.1 apply

1.2 let

1.3 also

1.4 run

1.5 with

1.6 takelf

1.7 takeUnless


标准函数

        标准函数是指Standard.kt文件中定义的函数,任何Kotlin代码都可以自由的调用所有标准函数,标准函数有很多我们这里主要学习下几个常用的标准函数。

1.1 apply

        apply函数可看作一个配置函数,你可以传入一个接收者,然后调用一系列函数来配置它以便使用,如果提供lambda给apply函数执行,它会返回配置好的接收者。


  
  1. fun main() {
  2.     var map = mutableMapOf("帅次" to 18).apply {
  3.         put("apply-北京",188)
  4.         put("apply-上海",288)
  5.     }
  6.     println(map)//{帅次=18, apply-北京=188, apply-上海=288}
  7. }
  • 1、创建可变Map

  • 2、通过apply()函数添加数据

如下,咱们启动一个界面并传参


  
  1.         val intent = Intent(this,NextActivity::class.java).apply {
  2.             putExtra("name","sc")
  3.             putExtra("age",19)
  4.         }
  5.         startActivity(intent)

        可以看到,调用一个个函数类配置接收者时,变量名(map、intent)就省掉了,这是因为,在lambda表达式里,apply能让每个配置函数都作用于接收者,这种行为有时又叫做相关作用域,因为lambda表达式里的所有函数调用都是针对接收者的,或者说,它们是针对接收者的隐式调用

1.2 let

        let函数能使某个变量作用于其lambda表达式里,让it关键字能引用它。let与apply比较,let会把接收者传给lambda,而apply什么都不传,匿名函数执行完,apply会返回当前接收者,而let会返回lambda的最后一行


  
  1.     var letData = 20.let {
  2.         "不知不觉过去 $it 年了"
  3.     }
  4.     println(letData)

1.3 also

        also函数和let函数功能相似,和let一样,also也是把接收者作为值参传给lambda,但有一点不同:also返回接收者对象,而let返回lambda结果。因为这个差异,also尤其适合针对同一原始对象,利用副作用做事,既然also返回的是接收者对象,你就可以基于原始接收者对象执行额外的链式调用


  
  1.     //also
  2.     var alsoData = "AndroidSHUAICI"
  3.     var strAlso = alsoData.also {
  4.         println(it.length)//14
  5.     }.also {
  6.         println(it.startsWith("Android"))//true
  7.     }
  8.     println(strAlso)//AndroidSHUAICI

1.4 run

        具备接收者的隐式调用(apply)返回的是lambda的最后一行(let)


  
  1.     //run
  2.     var str = "Android帅次"
  3.     var s = str.run {
  4.         startsWith("Android")
  5.     }
  6.     println(s)//true

加强版


  
  1. fun main() {
  2.     var runS = str.run {
  3.         startsWith("Android")
  4.         println(this)//Android帅次
  5.         "吼吼哈嘿"//这里决定下一个run的this类型
  6.     }.run {
  7.         println(this)//吼吼哈嘿
  8.         18//这里的18传入到isAge函数
  9.     }.run(::isAge)
  10.     println(runS)//false
  11. }
  12. fun isAge(age: Int) = age > 15

        从上面看出,run支持链式调用,run也支持函数引用。

1.5 with

        with函数是run的变体,功能一样,但是调用with时需要值参作为其第一个参数传入


  
  1.     var strWith = "Android帅次"
  2.     var sWith = strWith.run {
  3.         startsWith("Android")
  4.         "run-$this"
  5.     }
  6.     println(sWith)//run-Android帅次
  7.     sWith = with(strWith) {
  8.         startsWith("Android")
  9.         "with-$this"
  10.     }
  11.     println(sWith)//with-Android帅次

1.6 takelf

        如果需要判断某个条件是否满足再决定是否可以赋值变量或执行某项任务takelf就非常有用,概念上讲,takelf函数类似于if语句,但它的优势是可以直接在对象实例上调用,避免了临时变量赋值的麻烦。

        takelf函数需要判断lambda中提供的条件表达式,给出true或false结果:

  • 如果判断结果是true,从takelf函数返回接收者对象。

  • 如果是false,则返回null。


  
  1.     val strTakeIf = "Android帅次"
  2.     val tkif = strTakeIf.takeIf {
  3.         it.startsWith("Android")//返回true
  4.     }
  5.     println(tkif)//Android帅次
  6.     var tkifS= strTakeIf.takeIf {
  7.         it.startsWith("Android")
  8.     }.takeIf {
  9.         println("Length:${it?.length}")//Length:9
  10.         it?.length!! > 20//返回false
  11.     }
  12.     println(tkifS)//null

1.7 takeUnless

        takelf辅助函数takeUnless,只有判断你给定的条件结果是false时,takeUnless才会返回原始接收者对象,跟takelf刚好相反


  
  1.     val strTakeIfUn = "Android帅次"
  2.     val un = strTakeIf.takeUnless {
  3.         it.startsWith("Android")//返回true
  4.     }
  5.     println(un)//null
  6.     var un2 = strTakeIfUn.takeUnless {
  7.         it.startsWith("帅次")//返回false
  8.     }
  9.     println(un2)//Android帅次

        takeUnless函数有点调皮,了解一下就行。还是感觉takelf比较好理解和使用。

文章来源: shuaici.blog.csdn.net,作者:帅次,版权归原作者所有,如需转载,请联系作者。

原文链接:shuaici.blog.csdn.net/article/details/122126864

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。