文章目录

  1. 1. 基本类型
    1. 1.1. 局部变量与可变变量
    2. 1.2. 同一性与相等性
    3. 1.3. 字符串模板
    4. 1.4. 原生字符串
    5. 1.5. 数组是不型变
  2. 2. 可空值与 null 检测
  3. 3. 控制流
    1. 3.1. if 表达式
    2. 3.2. When 表达式
  4. 4. 解构声明
  5. 5. 参考资料
  6. 6. 推荐阅读


微信公众号

基本类型

局部变量与可变变量

Java 提供了八种基本类型:byte、short、int、long、float、double、boolean、char。对比下 Kotlin,它的数据类型分为:数字、字符、布尔、数组、字符串。数字类型包括 Byte、Short、Int、Long、Float、Double 等。注意的是,在 Kotlin 中对于数字没有隐式类型自动转换,换句话说,较?的类型不能隐式转换为较?的类型。Kotlin 中字符? Char 类型表?,布尔? Boolean 类型表?,字符串? String 类型表?。

Kotlin 有 val 和 var 两个关键字。 val 定义一个只读变量,var 定义一个可变变量,注意的是,Kotlin 支持?动推断出类型。

fun main(args: Array<
String>) {
    val x: Int = 21
    var y: Int = 11
    val z = 21 // ?动推断
}

同一性与相等性

在 Java 中,我们一般使用 equals() 比较两个变量的值是否相等。读者是否记得那道经典的面试题:说说 equals 与 == 的区别。事实上,这是?个?期困扰我们的问题,一不小心可能就掉坑了。我们再来理解下,==:比较两个变量的值是否相等(通常情况下,用来比较两个基本数据类型的值)。equals:比较的是两个对象的内容是否相同(通常情况下要重写equal)。

这里,Kotlin 中有两种类型的相等性:结构相等、引?相等 。结构相等,使用 == 比较两个变量/对象的值是否相等,使用 === 比较两个引?指向同?对象。

fun main(args: Array<
String>) {
    val x = "梁桂钊"
    val y = "梁桂钊"
    println(x == y)     // true
    println(x === y)    // true

    val a = 1
    var b = 1
    println(a == b)     // true
    println(a === b)    // true
}

字符串模板

在 Java 中,我们拼接含有变量的字符串非常麻烦,而 Kotlin 提供了一个简洁的方式,其字符串可以包含模板表达式 , 模板表达式以 $ 开头。

fun main(args: Array<
String>) {
    val name = "梁桂钊"
    val blog = "http://blog.720ui.com"
    var content = "我是 $name,博客地址:$blog"
    println(content)
}

原生字符串

事实上,Kotlin 提供了更加强大的原生字符串,使用 """ 括起来,内部没有转义并且可以包含换行和任何其他字符。

fun main(args: Array<
String>) {
    val code = """
            val name = "梁桂钊"
            val blog = "http://blog.720ui.com"
            var content = "我是 ${'$'}name,博客地址:${'$'}blog"
            println(content)
        """
    println(code)
}

注意的是,原生字符串和转义字符串内部都支持模板。 如果我们需要在原生字符串中表示$字符,我们需要改造成${'$'}

数组是不型变

数组在 Kotlin 中使? Array 类来表?,与 Java 不同的是, Kotlin 中数组是不型变的 。

可空值与 null 检测

在 Java 中, 我们经常遇到 NullPointerException ( NPE )异常,Kotlin 的类型系统帮助我们消除来自代码空引用的危险。当某个变量的值可以为 null 的时候, 必须在声明处的类型后添加? 来标识该引?可为空。

val blog: String? = "blog.720ui.com"

这里,我们可以显式检查 blog 是否为 null。

if(blog != null){
    println(blog.length)
}

如果没有这种显式检查,直接输出 blog.length 是不允许的(Kotlin 帮助我们做了一些检查工作)。因此,如果我们认为它一定存在值,这样改造成 blog!! 。注意的是,如果 blog 为空,就会抛出一个 NPE 异常。

blog!!.length

还有一种选择,我们可以写作 ?.,如果 blog 非空,就返回 blog.length ,否则返回 null。

blog?.length

此外,Kotlin 还支持链式调用,如果任意一个属性为空,这个链式调用就会返回 null。

因此,通过这个特性,可以让我们的代码变得非常简洁。

name?.size
name?.size ?: "empty"
name.getName() ?: throw IllegalArgumentException("name expected")

控制流

if 表达式

在 Kotlin 中, if 可以被当做语句使用。

val max = if (a > b) a else b

if 的分支也可以是代码块,最后的表达式作为该块的值。

val max = if (a > b) {
    print("Choose a")
    a
} else {
    print("Choose b")
    b
}

When 表达式

Java 语言中,我们使用 switch 操作符,但是必须使用常量(枚举常量、字符串、数字)作为分支。而 Kotlin 中, 使用 When 表达式,并且其允许使用任何类型。事实上,When 表达式非常灵活,可以被当做表达式,也可以被当做语句使用。此外,很多分支需要用相同的方式处理,可以支持任意表达式作为分支条件,可以检测一个值是否在一个区间或者集合中。

fun main(args: Array<
String>) {
    val x = 1
    when (x) {
        0 -> print("x == 0")
        1,2 -> print("x == 2")
        in 3..10 -> print("x in 3..10")
        is Any -> print("is Any")
        else -> {
            print("不匹配")
        }
    }
}

注意的是,与 Java 不同的是,我们不需要在每个分支上写 break 语句,如果其匹配成功,只有对应的分支会执行。

解构声明

在 Kotlin 中,可以把?个对象解构成很多变量。

val (name, age) = person
for ((key, value) in map) {}

参考资料

推荐阅读

文章目录

  1. 1. 基本类型
    1. 1.1. 局部变量与可变变量
    2. 1.2. 同一性与相等性
    3. 1.3. 字符串模板
    4. 1.4. 原生字符串
    5. 1.5. 数组是不型变
  2. 2. 可空值与 null 检测
  3. 3. 控制流
    1. 3.1. if 表达式
    2. 3.2. When 表达式
  4. 4. 解构声明
  5. 5. 参考资料
  6. 6. 推荐阅读