2.基础语法
类型声明
相比 Java 的类型声明方式:
1 | String s=new String(“I am Java”) |
Kotlin 将类型名置于变量后方:
1 | val s:String=“I am Kotlin” |
类型推导
Kotlin 支持隐式的类型声明,如:
1 | val s=“abc” |
函数类型
Kotlin 采用和变量类似的格式声明函数:
1 | fun sum(x: Int,y: Int): Int{return x+y} |
在不声明函数类型的情况下,默认函数类型为Unit
此外,对于简单的函数也可以通过表达式函数声明
1 | fun sum(x: Int,y: Int) = x + y |
使用表达式函数可以不进行类型声明,但大多数情况下不建议这么做,尤其是 Kotlin 作为一门不完全的函数式语言,并不支持全局类型推导,因此忽略类型声明会让我们在递归调用函数的时候出错
val 和 var
val
val 的底层是基于 final 实现的
- 当我们用 val 声明基本函数类型时,其值仅能被赋值一次
- 当我们用 val 声明引用类型时,引用不可变
在 swift 中,数组是被存放在栈中的,因此将数组声明为 val 会导致数据不可变,而 Kotlin 的数组是存放在堆中的,声明为 val仅会导致引用不可变
val 的优势
在程序开发中,我们应当尽可能采用val、不可变对象和纯函数来设计程序
- 纯函数即具有引用透明性、无副作用的函数
- 调用纯函数不会改变任何外部状态,也不会受外部状态影响,对于相同的输入总能给出相同的返回
在调用具有副作用(涉及到可变数据和共享变量)的代码时,往往会因为并发编程导致一系列的意外情况
防御性地采取 val 策略更加安全和可靠
var
var(可变数据)仍然有它存在的价值,考虑到当我们写一个简单的聚合操作:取最大值
1 | fun max(arr:Array<Int>):Int{ |
如果我们完全抛弃了常规编程语言中的可变数据类型,那么我们将不得不用递归调用的纯函数来实现类似的效果:
1 | fun max(arr:Array<Int>){ |
这种写法非常繁琐而且可读性不佳,因此 Kotlin 保留了 var 并且仅建议将其用于局部变量中
Comments