1.类型声明:类型名在变量名后面
String a = "I am Java";
val a: String = "I am Kotlin"
2.声明函数返回值类型:类型信息放在函数名后面,默认返回 Unit 类型。
int sum(int x, int y) { return x + y; } //Java
fun sum(x: Int, y: Int): Int { return x + y } //代码块函数体
fun sum(x: Int, y: Int) = x + y //表达式函数体
3.val和var使用规则
val 是 value(值)缩写,含义是引用不可变。var 是 varible(变量)缩写,可变。
4.高阶函数:以其他函数作为参数或返回值的函数
在kotlin中,如果一个函数的最后一个参数为函数,则可以将这个函数的函数体放到括号外面。
5.函数类型:(Int) -> Unit
- 通过 -> 符号来组织参数类型和返回值类型,左边是参数类型,右边是返回值类型;
- 必须用一个 () 来包裹参数类型;
- 返回值类型即使是 Unit,也必须显示声明。
() -> Unit
(Int, String) -> Unit
(errCode: Int, errMsg: String) -> Unit
(errCode: Int, errMsg: String?) -> Unit
((errCode: Int, errMsg: String?) -> Unit)?
(Int) -> ((Int) -> Unit) //返回类型为 (Int) -> Unit 函数
(Int) -> Int -> Unit //简化省略后半部分括号
6.方法和成员引用:通过两个冒号 :: 实现对某个类的方法和成员进行引用。
7.匿名函数:缺省函数名的情况下,直接定义一个函数。
8.Lambda是语法糖
- 一个 Lambda 表达式必须通过 {} 来包裹;
- 如果 Lambda 声明了参数部分的类型,且返回值类型支持类型推导,那么 Lambda 变量就可以省略函数类型声明;
- 如果 Lambda 变量声明了函数类型,那么 Lambda 的参数部分的类型就可以省略。
val sum: (Int, Int) -> Int = { x: Int, y: Int -> x + y } //sum是函数类型
val sum = { x: Int, y: Int -> x + y } //省略函数类型声明
val sum: (Int, Int) -> Int = { x, y -> x + y } //省略参数类型声明
Kotlin 在 JVM 层设计了 Function 类型(Function0、Function1...Function22)来兼容 Java 的 Lambda 表达式,其中的后缀数字代表了 Lambda 参数的数量。
9.函数、Lambda和闭包
- fun在没有等号、只有花括号的情况下,是代码块函数体,如果返回非 Unit 值,必须带 return ;
- fun带有等号,是单表达式函数体。该情况下可以省略 return。
在 Kotlin 中,匿名函数体、Lambda在语法上都存在 {} ,由这对花括号包裹的代码块如果访问了外部环境变量则被称为一个闭包。一个闭包可以被当作参数传递或者直接使用,它可以简单看成“访问外部环境变量的函数”。Lambda 是 Kotlin 中最常见的闭包形式。
10.“柯里化”风格、扩展函数
柯里化指的是把接收多个参数的函数变成一系列仅接收单一参数函数的过程,最返回最终结果之前,前面的函数依次接收单个参数,然后返回下一个新的函数。
11.表达式
表达式可以是一个值、常量、变量、操作符、函数,或它们之间的组合,编程语言对其进行解释和计算,以求产生另一个值。
- 表达式比语句更安全
- Unit类型:让函数调用皆为表达式
- 复合表达式:更好的表达力
12.枚举类和when表达式
在 Kotlin 中,枚举是通过一个枚举类来实现的:enum class XXX {}
when表达式具体语法:
- 一个完整的 when 表达式类似 switch 语句,由 when 关键字开始,用花括号包括多个逻辑分支,每个分支由 -> 连接,不再需要 switch 的 break,由上到下匹配,一直匹配完为止,否则执行 else 分支的逻辑,类似 switch 的default。
- 每个逻辑分支具有返回值,最终整个 when 表达式的返回类型就是所有分支相同的返回类型,或公共的父类型。
- when 关键字的参数可以省略。
- 表达式可以组合。
13.for循环和范围表达式
for (int i = 0; i < 10; i++) {}
for (i in 1..10) {}
for (i in 1..10 setp 2) {}
14.中缀表达式:in、setp、downTo、until
Kotlin标准库中 to 方法设计,通过泛型实现,返回一个 Pair。
infix fun <A, B> A.to(that: B) : Pair<A, B>
中缀函数表达形式:A 中缀方法 B
- 中缀函数必须是某个类型的扩展函数或者成员方法;
- 中缀函数只能有一个参数;
- 中缀函数的参数不能有默认值;
- 中缀函数的参数不能是可变参数,参数数量始终为1。
15.字符串的定义和操作
- 定义原生字符串:使用3个引号定义的字符串,最终打印格式与在代码中呈现的格式一致。
- 字符串模板:通过 ${name} 格式传入字符串。
- 字符串判等:==判断内容是否相同,===判断应用是否一样。