自己不用关系 \n 换行 ,不用自己调整
val infoMesage = “””
AAAAAAAAAAA
BBBBBBBBBBB
CCCCCCCCCCC
DDDDDDDDDDD
EEEEEEEEEEE
“”” // 前置空格
println(infoMesage)

val infoMesage2 = """
    AAAAAAAAAAA
    BBBBBBBBBBB
    CCCCCCCCCCC
    DDDDDDDDDDD
    EEEEEEEEEEE
""".trimIndent()  // 没空格
println(infoMesage2)

val infoMesage3 = """
    ?AAAAAAAAAAA
    ?BBBBBBBBBBB
    ?CCCCCCCCCCC
    ?DDDDDDDDDDD
    ?EEEEEEEEEEE
""".trimMargin("?")  // 没空格 控制|
println(infoMesage3)

// 需求:显示 $99999.99
val price = """
    ${'$'}99999.99
""".trimIndent()
println(price)

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 空安全(Null safety)| NULL检查机制

**null安全可以说是Kotlin语言对Java的重大改进之一**

## 初始化?的使用:非空类型与可空类型

在此之前,我们需要知道**java变量是有默认值的,局部变量是没有默认值的。而kotlin变量都没有默认值**。

Kotlin 默认变量不能持有 null 值,也就是说它是一个**非空类型**。这意味着以下代码段无效:

```kotlin
// Fails to compile
val v1: String = null //v1默认非空类型

在变量类型后面加上 ? 后缀,将变量指定为可为 null,即可空类型。如以下示例所示:

1
val v2: String? = null

如果我们把kotlin源代码编译成字节码。然后通过字节码反编译成java代码,你会发现使用修饰的变量,会是一个Java的包装类型(比如Ingeter),反之为基本数据类型(比如int)。

一定要知道使用**?**和不使用,它们不是同一个类型。

断言运算符!!?

当然,Kotlin的空安全设计对于声明可为空的参数也有处理方式,在使用时要进行空判断处理,有两种处理方式,字段后加!!像Java一样抛出空异常,另一种字段后加?

1
2
3
4
5
6
7
8
9

var info: String? = null

// println(info?.length) // 第一种补救:? 如果info是null,就不执行 .length

// println(info!!.length) // 第2种补救: !! 我自己负责info 不会为null == (不管null不null必须执行) == Java

/*if (info != null) // 第3种补救: == Java,条件语句内不必使用安全调用运算符或非 null 断言运算符来处理可为 null 的值。
println(info.length)*/

函数返回值可为空

1
2
3
4
5
6
7
// : Int? === 允许返回null
fun testMethod(name: String) : Int? {
if (name == "zs") {
return 99999
}
return null
}

?:操作符

1
2
// ?:  如果你一定要输出null  就让你  “你很牛逼”
println(info?.length ?: "你很牛逼")

区间表达式(Range expressions)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package simple01.s05

// TODO 区间
fun main() {

// 1 到 9
for (i in 1..9) {
// println(i)
}

// 不会输出
for (i in 9..1) {
// println(i)
}

// 大 到 小
for (i in 9 downTo 1) {
// println(i)
}

// 用区间做判断
val value = 88
if (value in 1..100) {
// println("包了 1 到 100")
}

// 步长指定
for (i in 1..20 step 2) {
// 1 3 5 7 ...
// println(i)
}

// 排除 最后元素
for (i in 1 until 10) {
println(i)
}
}

数组

typealis

函数字面量和内联函数(Function literals & inline functions)

智能转换(Smart casts)