Kotin重要特性:
类型推导:定义变量不再需要显示声明类型,由编译器自动推导出变量的类型 如 val a ="hello” val b = 5 val c = 10L
表达式函数: fun sum(x: Int, y: Int) = x + y // 省略了{},Kotlin支持这种用单行表达式与等号的语法来定义函数,叫作表达式函数体,作为区分,普通的函数声明则可叫作代码块函数体。
val 和 var 的使用规则
如果说 var 代表了 varible(变量),那么 val 可看成 value(值)的缩写。但也有人觉得这样并不直观或准确,而是把 val 解释成 varible + final,即通过 val 声明的变量具有 Java 中的 final 关键字的效果,也就是引用不可变。
我们可以在 IntelliJ IDEA 或 Android Studio 中查看 val 语法反编译后转化的 Java 代码,从中可以很清楚地发现它是用 final 实现这一特性的。
val 的含义:引用不可变 (变量一旦初始化就不能更改指向,但是可以更改变量指向的内容里的值) 因此,val 声明的变量是只读变量,它的引用不可更改,但并不代表其引用对象也不可变。事实上,我们依然可以修改引用对象的可变成员。这跟 Java 中的 final 对象概念上是一样的。
重要原则:优先使用 val 来声明变量。更好的理解可以是:尽可能采用 val、不可变对象及纯函数来设计程序。关于纯函数的概念,其实就是没有副作用的函数,具备引用透明性。
因为引用不可变,val 声明的变量只能被赋值一次,且在声明时不能省略变量类型。
在 Kotlin 编程中,我们推荐优先使用 val 来声明⼀个本身不可变的变量,这在大部分情况下更具有优势:
这是⼀种防御性的编码思维模式,更加安全和可靠,因为变量的值永远不会在其他地方被修改(⼀些框架采用反射技术的情况除外);在Java中进行多线程开发时,由于Java的变量默认都是可变的,状态共享使得开发工作很容易出错,不可变性则可以在很大程度上避免这⼀点。
不可变的变量意味着更加容易推理,越是复杂的业务逻辑,它的优势就越大。
既然有了 val, 为什么还要使用 var?
因为 var 有更好的性能,占用内存更少。所以,尤其是可能在业务中需要存储大量的数据的数据结构,如集合遍历中使用 var 来计算结果等,显然采用 var 是其更加适合的实现方案。
在函数式开发中,我们优先推荐使用 val 和不可变对象来减少代码中的副作用,提升程序的可靠性和可组合性。在⼀些个别情况下,尤其是强调性能的代码中,用 var 定义局部变量会更加适合。
编译时常量
val 声明的变量只能算是不可变的变量,但并不是一个常量,要定义一个真正意义上的常量,必须使用 const,const 只能修饰基本类型,且必须初始化
这样定义了一个编译时常量,等价于 java 的 static final int
字符串的定义和操作
和 Java 的字符串没什么不同,但是由于 String 是⼀个字符序列,所以我们可以直接对其进行遍历:
还可以访问这个字符序列的成员:
此外,Kotlin 的字符串还有各种丰富的 API,如:
定义原生字符串
简而言之,用这种3个引号定义的字符串,最终的打印格式与在代码中所呈现的格式⼀致,而不会解释转化转义字符(正如上述例子中的\n),以及Unicode的转义字符(如\uXXXX)。比如,我们用字符串来描述一段HTML代码,用普通字符串定义时必须是这样子:
采用原生字符串的格式,会非常方便。如下:
字符串模板
此外,除了变量,我们当然也可以通过同样的方式把表达式插入字符串中,并且在${expression}中使用双引号。如:
字符串判等
Kotlin中的判等性主要有两种类型:
结构相等。通过操作符 == 来判断两个对象的内容是否相等。
引用相等。通过操作符 === 来判断两个对象的引用是否一样,与之 相反的判断操作符是 ! == 。如果比较的是在运行时的原始类型,比如 Int,那么 === 判断的效果也等价于 ==。