一、标准函数
标准函数是指Standard.kt文件中定义的函数,任何Kotlin代码都可以自由的调用所有标准函数,标准函数有很多我们这里主要学习下几个常用的标准函数。
1.1 apply
apply函数可看作一个配置函数,你可以传入一个接收者,然后调用一系列函数来配置它以便使用,如果提供lambda给apply函数执行,它会返回配置好的接收者。
fun main() {
var map = mutableMapOf("帅次" to 18).apply {
put("apply-北京",188)
put("apply-上海",288)
}
println(map)//{帅次=18, apply-北京=188, apply-上海=288}
}
- 1、创建可变Map
- 2、通过apply()函数添加数据
如下,咱们启动一个界面并传参
val intent = Intent(this,NextActivity::class.java).apply {
putExtra("name","sc")
putExtra("age",19)
}
startActivity(intent)
可以看到,调用一个个函数类配置接收者时,变量名(map、intent)就省掉了,这是因为,在lambda表达式里,apply能让每个配置函数都作用于接收者,这种行为有时又叫做相关作用域,因为lambda表达式里的所有函数调用都是针对接收者的,或者说,它们是针对接收者的隐式调用。
1.2 let
let函数能使某个变量作用于其lambda表达式里,让it关键字能引用它。let与apply比较,let会把接收者传给lambda,而apply什么都不传,匿名函数执行完,apply会返回当前接收者,而let会返回lambda的最后一行。
var letData = 20.let {
"不知不觉过去 $it 年了"
}
println(letData)
1.3 also
also函数和let函数功能相似,和let一样,also也是把接收者作为值参传给lambda,但有一点不同:also返回接收者对象,而let返回lambda结果。因为这个差异,also尤其适合针对同一原始对象,利用副作用做事,既然also返回的是接收者对象,你就可以基于原始接收者对象执行额外的链式调用。
//also
var alsoData = "AndroidSHUAICI"
var strAlso = alsoData.also {
println(it.length)//14
}.also {
println(it.startsWith("Android"))//true
}
println(strAlso)//AndroidSHUAICI
1.4 run
具备接收者的隐式调用(apply),返回的是lambda的最后一行(let)。
//run
var str = "Android帅次"
var s = str.run {
startsWith("Android")
}
println(s)//true
加强版
fun main() {
var runS = str.run {
startsWith("Android")
println(this)//Android帅次
"吼吼哈嘿"//这里决定下一个run的this类型
}.run {
println(this)//吼吼哈嘿
18//这里的18传入到isAge函数
}.run(::isAge)
println(runS)//false
}
fun isAge(age: Int) = age > 15
从上面看出,run支持链式调用,run也支持函数引用。
1.5 with
with函数是run的变体,功能一样,但是调用with时需要值参作为其第一个参数传入。
var strWith = "Android帅次"
var sWith = strWith.run {
startsWith("Android")
"run-$this"
}
println(sWith)//run-Android帅次
sWith = with(strWith) {
startsWith("Android")
"with-$this"
}
println(sWith)//with-Android帅次
1.6 takelf
如果需要判断某个条件是否满足,再决定是否可以赋值变量或执行某项任务,takelf就非常有用,概念上讲,takelf函数类似于if语句,但它的优势是可以直接在对象实例上调用,避免了临时变量赋值的麻烦。
takelf函数需要判断lambda中提供的条件表达式,给出true或false结果:
- 如果判断结果是true,从takelf函数返回接收者对象。
- 如果是false,则返回null。
val strTakeIf = "Android帅次"
val tkif = strTakeIf.takeIf {
it.startsWith("Android")//返回true
}
println(tkif)//Android帅次
var tkifS= strTakeIf.takeIf {
it.startsWith("Android")
}.takeIf {
println("Length:${it?.length}")//Length:9
it?.length!! > 20//返回false
}
println(tkifS)//null
1.7 takeUnless
takelf辅助函数takeUnless,只有判断你给定的条件结果是false时,takeUnless才会返回原始接收者对象,跟takelf刚好相反
val strTakeIfUn = "Android帅次"
val un = strTakeIf.takeUnless {
it.startsWith("Android")//返回true
}
println(un)//null
var un2 = strTakeIfUn.takeUnless {
it.startsWith("帅次")//返回false
}
println(un2)//Android帅次
takeUnless函数有点调皮,了解一下就行。还是感觉takelf比较好理解和使用。
下面给大家分享两份资料:字节跳动内部超高质量Kotlin笔记、谷歌大佬编写高级Kotlin强化实战(附Demo)。
一、字节跳动内部超高质量Kotlin笔记
1.准备开始
- 基本语法
- 习惯用语
- 编码风格
2.基础
- 基本类型
- 包
- 控制流
- 返回与跳转
3.类和对象
- 类和继承
- 属性和字段
- 接口
- 可见性修饰词
- 扩展
- 数据对象
- 泛型
- 嵌套类
- 枚举类
- 对象表达式和声明
- 代理模式
- 代理属性
4.函数和lambda表达式
- 函数
- 高阶函数与 lambda 表达式
- 内联函数
5.其它
- 多重申明
- Ranges
- 类型检查和自动转换
- This表达式
- 等式
- 运算符重载
- 空安全
- 异常
- 注解
- 反射
- 动态类型
6.互用性
- 动态类型
7.工具
- 使用Maven
- 使用 Ant
- 使用 Gradle
- 使用Griffon
8.FAQ
- 与java对比
- 与Scala对比
基础知识掌握之后就是靠实战提升了!
二、谷歌大佬编写高级Kotlin强化实战(附Demo)
第一章 Kotlin入门教程
- Kotlin 概述
- Kotlin 与 Java 比较
- 巧用 Android Studio
- 认识 Kotlin 基本类型
- 走进 Kotlin 的数组
- 走进 Kotlin 的集合
- 集合问题
- 完整代码
- 基础语法
第二章 Kotlin 实战避坑指南
- 方法入参是常量,不可修改
- 不要 Companion 、INSTANCE ?
- Java 重载,在 Kotlin 中怎么巧妙过渡一下?
- Kotlin 中的判空姿势
- Kotlin 复写 Java 父类中的方法
- Kotlin “狠”起来,连TODO 都不放过!
- is、as` 中的坑
- Kotlin 中的 Property 的理解
- also 关键字
- takeIf 关键字
- takeIf 关键字
- 单例模式的写法
第三章 项目实战《Kotlin Jetpack 实战》
- 从一个膜拜大神的 Demo 开始
- Kotlin 写 Gradle 脚本是一种什么体验?
- Kotlin 编程的三重境界
- Kotlin 高阶函数
- Kotlin 泛型
- Kotlin 扩展
- Kotlin 委托
- 协程“不为人知”的调试技巧
- 图解协程:suspend
更多Android可以查看我的个人介绍!!!