《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


目录
相关文章
|
7月前
|
编译器 C++ Kotlin
【Kotlin】基础速览(1):操作符 | 内建类型 | 类型转换 | 字符串模板 | 可变 var 和不可变 val
【Kotlin】基础速览(1):操作符 | 内建类型 | 类型转换 | 字符串模板 | 可变 var 和不可变 val
40 0
|
11月前
|
XML 前端开发 安全
kotlin使用spring mvc将接收的字符串生成二维码并响应
使用kotlin制作一个基于`spring mvc`的小demo:接收请求中的字符串参数,用`zxing`将字符串生成出一个二维码,再返回给前端。可以通过此例来了解kotlin与spring的搭配
208 1
|
Kotlin
Kotlin 作用域函数之let、with、run、also、apply的使用笔记
`Kotlin` 标准库包含几个函数,目的是在对象的上下文中执行代码块。**当对一个对象调用这样的函数并提供一个 `lambda` 表达式时,会形成一个临时作用域。在此作用域中,可以访问该对象而无需其名称。这些函数称为作用域函数**。共有以下五种:`let、run、with、apply 以及 also`。
153 0
|
Java Android开发 Kotlin
【Kotlin 初学者】字符串常用操作汇总(下)
五、字符串比较 六、字符串查找 七、字符串验证 八、大杂烩
359 0
【Kotlin 初学者】字符串常用操作汇总(下)
|
Java Kotlin 索引
【Kotlin 初学者】字符串常用操作汇总(上)
一、字符串创建 1.1 字符串属性 1.2 字符串函数 二、字符串截取 三、字符串分割 四、字符串替换
752 0
【Kotlin 初学者】字符串常用操作汇总(上)
|
安全 Java 调度
Kotlin Coroutines 笔记 (二)
Kotlin Coroutines 笔记 (二)
158 0
Kotlin Coroutines 笔记 (二)
|
编译器 API 调度
Kotlin Coroutines 笔记 (一)
Kotlin Coroutines 笔记 (一)
134 0
Kotlin Coroutines 笔记 (一)
|
Java Android开发 图形学
Android修行手册之Kotlin-【变量和常量】、【基础类型】、【字符串】篇
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
190 0
|
Dart Java Kotlin
全网最细笔记java与kotlin的一些异同
后面可能还会继续比较kotlin和dart 期待吗? 打印日志
132 0
|
Kotlin Java Android开发
带你读《Kotlin核心编程》之三:面向对象
本书不是一本简单介绍Kotlin语法应用的图书,而是一部专注于帮助读者深入理解Kotlin的设计理念,指导读者实现Kotlin高层次开发的实战型著作。书中深入介绍了Kotlin的核心语言特性、设计模式、函数式编程、异步开发等内容,并以Android和Web两个平台为背景,演示了Kotlin的实战应用。