2.基础语法

Smile_slime_47

类型声明

相比 Java 的类型声明方式:

1
String s=new String(“I am Java”)

Kotlin 将类型名置于变量后方:

1
val s:String=“I am Kotlin”

类型推导

Kotlin 支持隐式的类型声明,如:

1
2
val s=“abc”
val i=1234

函数类型

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
2
3
4
5
6
7
fun max(arr:Array<Int>):Int{
var max=Int.MIN_VALUE
for(i in arr){
if(max<i)max=i
}
return max
}

如果我们完全抛弃了常规编程语言中的可变数据类型,那么我们将不得不用递归调用的纯函数来实现类似的效果:

1
2
3
4
5
6
7
8
9
10
11
fun max(arr:Array<Int>){
fun inner_max(list:Array<Int>,tmp:Int,itr:Int){
if(itr>=list.size)return tmp
else{
val el=list[itr]
val gr=if(tmp>el) tmp else el
return inner_max(list,gr,itr+1)
}
}
return inner_max(arr,Int.MIN_VALUE,0)
}

这种写法非常繁琐而且可读性不佳,因此 Kotlin 保留了 var 并且仅建议将其用于局部变量

Comments