《Kotlin核心编程》笔记:val 和 var & 字符串

简介: 《Kotlin核心编程》笔记:val 和 var & 字符串

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 对象概念上是一样的。

image.png

重要原则:优先使用 val 来声明变量更好的理解可以是:尽可能采用 val、不可变对象及纯函数来设计程序。关于纯函数的概念,其实就是没有副作用的函数,具备引用透明性。

因为引用不可变,val 声明的变量只能被赋值一次,且在声明时不能省略变量类型。

在 Kotlin 编程中,我们推荐优先使用 val 来声明⼀个本身不可变的变量,这在大部分情况下更具有优势:

这是⼀种防御性的编码思维模式,更加安全和可靠,因为变量的值永远不会在其他地方被修改(⼀些框架采用反射技术的情况除外);在Java中进行多线程开发时,由于Java的变量默认都是可变的,状态共享使得开发工作很容易出错,不可变性则可以在很大程度上避免这⼀点。

不可变的变量意味着更加容易推理,越是复杂的业务逻辑,它的优势就越大。

既然有了 val, 为什么还要使用 var?

因为 var 有更好的性能,占用内存更少。所以,尤其是可能在业务中需要存储大量的数据的数据结构,如集合遍历中使用 var 来计算结果等,显然采用 var 是其更加适合的实现方案。

在函数式开发中,我们优先推荐使用 val 和不可变对象来减少代码中的副作用,提升程序的可靠性和可组合性。在⼀些个别情况下,尤其是强调性能的代码中,用 var 定义局部变量会更加适合。

编译时常量

val 声明的变量只能算是不可变的变量,但并不是一个常量,要定义一个真正意义上的常量,必须使用 constconst 只能修饰基本类型,且必须初始化

image.png

这样定义了一个编译时常量,等价于 java 的 static final int

字符串的定义和操作

image.png

和 Java 的字符串没什么不同,但是由于 String 是⼀个字符序列,所以我们可以直接对其进行遍历

image.png

还可以访问这个字符序列的成员:

image.png

此外,Kotlin 的字符串还有各种丰富的 API,如:

image.png

定义原生字符串

image.png

简而言之,用这种3个引号定义的字符串,最终的打印格式与在代码中所呈现的格式⼀致,而不会解释转化转义字符(正如上述例子中的\n),以及Unicode的转义字符(如\uXXXX)。比如,我们用字符串来描述一段HTML代码,用普通字符串定义时必须是这样子:

image.png

采用原生字符串的格式,会非常方便。如下:

image.png

字符串模板

image.png

此外,除了变量,我们当然也可以通过同样的方式把表达式插入字符串中,并且在${expression}中使用双引号。如:

image.png

字符串判等

Kotlin中的判等性主要有两种类型:

结构相等。通过操作符 == 来判断两个对象的内容是否相等。

引用相等。通过操作符 === 来判断两个对象的引用是否一样,与之 相反的判断操作符是 ! == 。如果比较的是在运行时的原始类型,比如 Int,那么 === 判断的效果也等价于 ==。

image.png


目录
相关文章
|
14天前
|
Java Kotlin
​ Kotlin教程笔记(15) - 方法重载与默认参数
​ Kotlin教程笔记(15) - 方法重载与默认参数
30 4
​ Kotlin教程笔记(15) - 方法重载与默认参数
|
8天前
|
Kotlin 索引
Kotlin教程笔记(22) -常见高阶函数
Kotlin教程笔记(22) -常见高阶函数
|
8天前
|
Kotlin
Kotlin教程笔记(21) -高阶函数与函数引用
Kotlin教程笔记(21) -高阶函数与函数引用
|
8天前
|
Kotlin
Kotlin教程笔记(20) - 枚举与密封类
Kotlin教程笔记(20) - 枚举与密封类
23 3
|
8天前
|
Java Kotlin
Kotlin教程笔记(19) - 内部类
Kotlin教程笔记(19) - 内部类
20 3
|
12天前
|
设计模式 安全 Java
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
Kotlin教程笔记(57) - 改良设计模式 - 单例模式
|
11天前
|
Java Kotlin 索引
Kotlin教程笔记(9) - 分支与循环
Kotlin教程笔记(9) - 分支与循环
27 5
|
8天前
|
安全 Kotlin
Kotlin教程笔记(23) -作用域函数
Kotlin教程笔记(23) -作用域函数
|
9天前
|
安全 IDE Java
Kotlin教程笔记(3) - 空类型和智能类型转换
Kotlin教程笔记(3) - 空类型和智能类型转换
|
12天前
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式