基础

静态类型的编程语言

  • 关键字 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
    2
    3
    4
    5
    6
    7
    class User constructor(name: String) {
    val name: String

    init {
    this.name = name
    }
    }

    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 表达式可以有多条语句