Kotlin

2019-08-08
programming languages

1. 基础语法

1.1 不一样的类型声明

  • val a : String = "I am Kotlin"这种类型声明的方式使得代码的可读性更好,同时有利于省略类型声明。
  • Kotlin有自动类型推导,提高了开发效率。
  • fun sum(x: Int, y: Int): Int {return x + y},依然需要定义函数的返回值类型,Int不可以省略。函数的默认返回值为Unit类型
  • 对于表达式定义的接口方法,显式声明类型虽然不是必需的,但可以很大程度上提升代码的可读性。

1.2 val & var

  • val = final in Java (引用不可以更改)。
  • 优先使用val来声明变量,尽可能采用val,不可变对象以及纯函数来设计程序
  • 对于经常需要变动的变量使用var,会比val有更好的performance。

1.3 高阶函数和Lambda

  • 函数式语言一个典型的特征就在于函数是头等公民,我们不仅可以像类一样在顶层直接定义一个函数,也可以在函数内部定义一个局部函数。
  • 高阶函数便是以其他函数作为参数或者返回值的函数,是一种更加抽象的机制,极大地提高了语言的表达能力。
  • Kotlin中的函数类型声明需要遵从以下几点:
    • 通过->符号来组织参数类型和返回值类型,左边是参数类型,右边是返回值类型。
    • 必须用一个括号来包裹参数类型。如果是一个没有参数的函数类型,参数类型部分就用()来表示。
    • 返回值类型即使是Unit,也必须显式声明。
      • () -> Unit
      • (Int) -> Unit
      • ((errorCode: Int, errMsg: String?) -> Unit)?:?为可选参数,表示errMsg在某些情况下可以传入空值。?在函数后表示该函数在某些情况下也可以不需要传入。
      • (Int) -> ((Int) -> Unit):传入一个Int,返回一个函数
      • ((Int) -> Int) -> Unit:传入一个函数,返回一个Unit
  • 对于某些只是临时性的函数,kotlin支持直接将其定义为匿名函数(仅限于用作参数时使用)。

Lambda

  • 匿名函数是kotlin中重要的组成部分,它也被称作Lambda表达式,实际上就是通过语法糖生成简化后的匿名函数。
  • Lambda的语法:
    • 一个Lambda表达式必须通过{}来包裹。
    • 如果Lambda声明了参数部分的类型,且返回值类型支持类型推导,那么Lambda变量就可以省略函数类型声明。
    • 如果Lambda变量声明了函数类型,那么Lambda的参数部分的类型就可以省略。
    • 如果Lambda表达式返回的不是Unit,那么默认最后一行表达式的值类型就是返回值类型。

3. 面向对象

  • Sealed关键字迎来修饰一个类为密封类,若要继承则需要将子类定义在同一个文件中,其他文件中无法继承它。Sealed类无法被初始化,因为它背后是基于一个抽象类实现的。
  • internalmodule内可见。
  • protected类以及子类可见。

6. Lambda和集合

内联函数

  • inlinefunction将会直接运行function中的表达式,非inlinefunction则会先生成一个匿名function再运行表达式。非inlinefunction会产生更大的运行开销。

小结

  • Kotlin的Collections有许多的API可供使用。
  • Kotlin分为只读集合和可变集合,但是只读集合并不是安全的,在一些情况下也可以被改变,尤其与Java集合互通时。
  • 处理含有大量数据的集合时,建议使用sequence,这样在进行链式操作时不会产生中间变量。
  • 序列sequence分为两种操作方式,中间操作和末端操作,末端操作执行时才会触发中间操作的计算。

7. 多态和扩展

小结

  • Kotlin中存在扩展函数,对应Java中的静态方法,提供了极大的便利,可以在已有的class或者集合上进行扩展。
  • 同名的类成员方法的优先级总是高于扩展函数。
  • 扩展接收器总是被静态调度,编译时期是什么类型,运行时就会运行对应类型的方法。换句话说,扩展函数的调用类型总是根据编译时期的类型,扩展函数是无法被覆盖的。

8. 元编程

  • 描述数据的数据可以称之为元数据。
  • 程序是描述需求的数据,描述程序的数据就是程序的元数据。

小结

  • Kotlin目前只支持元编程-反射。和Java的使用方法非常接近。
  • Kotlin的注解可以通过反射在运行期间获取。
  • Kotlin的注解处理器和Java一样没有简单优雅的代码生成方案。