Kotlin skills
基础
静态类型的编程语言
- 关键字 fun 用来声明一个函数
函数
- 参数列表的后面跟着返回类型,它们之间用一个冒号隔开
- 在 Kotlin 中,if 是表达式,而赋值操作变成了语句
- 只有表达式体函数的返回类型可以忽略
- 对于有返回值的代码块体函数,必须显式地写出返回类型和 return 语句
变量
- 如果变量没有初始化器,必须显式地指定它的类型
- 尽可能地使用 val 关键字来声明所有的 Kotlin 变量
- val 变量只能进行唯一一次初始化
- 即使 var 关键字允许变量改变自己的值,但它的类型却是改变不了的
枚举
- enum class 表示枚举类型
- 如果要在枚举类中定义任何方法,就要使用分号把枚举常量列表和方法定义分开
when
- when 对应 Java 中的 switch 语句
- when 可以带参数以及不带参数
- Kotlin 没有三元运算符,可以用 when 来代替 if
智能转换
- 在 Kotlin 中,你要使用 is 检查来判断一个变量是否是某种类型
- 使用 as 关键字来表示到特定类型的显式转换
循环
- 使用 … 运算符来表示区间
- downTo
- step
- until
- in: 检查区间的成员
集合迭代
- Map
for ((key, value) in map)
- List
for ((index, value) in list.withIndex())
异常
- Kotlin 不区分受检异常和非受检异常
命名参数
- 当调用一个 Kotlin 定义的函数时,可以显式地标明一些参数的名称
- 在 Kotlin 中,可以在声明参数的时候,指定参数的默认值
- 如果使用命名参数,可以省略中间的一些参数
- Java 没用参数默认值的概念,当从 Java 中调用 Kotlin 函数的时候,必须显式地制定所有参数值
- 通过
@file: JvmName("class name")
可以指定类名 - 如果想把一个常量以 public static final 的属性暴露给 Java,可以使用 const 修饰属性
- 在导入声明的时候,关键字 as 是解决命名冲突问题的唯一方式
可变参数
- vararg:可变参数
*arg
:展开运算符- to:中缀调用,适合 map
正则表达
分割
- split 支持指定多个分隔符
- 可以使用正则表达式分割
- string.toRegex():生成表达式
正则表达式写在三重引号的字符串中,不需要对任何字符进行转义
接口
- 使用 interface 关键字而不是 class 来声明一个 Kotlin 的接口
- 在 Kotlin 中使用 override 修饰符是强制要求的
- 接口可以有默认实现
- 使用父类实现:
super<SuperClass>.fun
- 在接口中,不能使用 final、open、abstract
- 接口中的成员始终是 open 的,不能将其声明为 final
- 实现接口属性 (override val props:Type)
修饰符
- Kotlin 中类和方法默认都是 final 的
- 如果你想允许创建一个类的子类,需要使用 open 修饰符来表示这个类。此外,需要给每一个可以被重写的属性和方法添加 open 修饰符。
可见性修饰符
在 Kotlin 中,protected 成员只在类和它的子类中可见,类的扩展函数不能访问它的 private 和 protected 成员
- 默认:public
- 模块:internal
- protected
- private
内部类和嵌套类
- Kotlin 的嵌套类不能访问外部类的实例
- 变成内部类来持有一个外部类的引用需要使用 inner 修饰符
- 密封类:sealed,子类直接嵌套在父类中
构造函数
- 主构造方法
1 | class User constructor(name: String) { |
class User (val name: String)
- 构造方法参数可以提供默认值
- 要创建一个类的实例,只需要直接调用构造方法,不需要 new 关键字
-
从构造方法
constuctor(value: type)
-
在 setter 的函数体中,使用 field 来访问支持字段的值
-
在 Kotlin 中,== 运算符是比较是否相等,=== 运算符比较引用是否相等
-
数据类:data
-
类委托:by
对象
- 对象声明:object
- Kotlin 的类不能拥有 static 成员
- 顶层函数不能访问类的 private 成员
- 伴生对象:companion object
可空性
为了避免 NullPointerExceptiom 错误
在类型后面加上 ?
来表示可空
运算符
- 安全调用运算符:
?.
来调用函数或者属性,空则返回null
- Elvis 运算符:
?:
经常与安全调用运算符一起使用,用一个值代替对 null 对象调用方法时返回的 null - 安全转换:
as?
尝试把值转换成指定的类型,常见与 Elvis 运算符一起使用 - 非空断言:
!!
可以把任何值转换成非空类型,如果对 null 值做非空断言,则会抛出异常,另外避免在同一行中使用多个非空断言 - let 函数:结合安全调用运算符,能有效地调用 let 函数的可空对象,转变为非空类型
- 延迟初始化器的属性:使用
lateint
修饰符修饰属性,该属性必须为 var,常用于依赖注入
Lambda 编程
Lambda 表达式,本质上就是可以传递给其他函数的一小段代码,把函数当作值看待
- 如果 lambda 刚好是函数或者属性的委托,可以用成员引用替换
- Kotlin 的 lambda 表达式始终用花括号包围,实参并没有使用括号括起来,箭头把实参列表和 lambda 的函数体隔开
- 需要把一小段代码封闭到一个代码块中,可以使用库函数
run
来执行传给它的 lambda
1 | run { lambda expression } |
- 如果 lambda 表达式是函数调用的最后一个实参,它可以被放到括号的外面
- 当 lambda 是函数唯一的实参时,还可以去掉调用代码的空括号
- lambda 默认参数名称 it 代替命名参数
- lambda 表达式可以有多条语句
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 知识碰撞!
评论