Kotlin的语法糖(一)基础篇

原文地址:梁桂钊的博客git

博客地址:blog.720ui.comgithub

欢迎转载,转载请注明做者及出处,谢谢!面试

基本类型

局部变量与可变变量

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

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)。bash

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

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 提供了一个简洁的方式,其字符串能够包含模板表达式 , 模板表达式以 $ 开头。spa

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

原生字符串

事实上,Kotlin 提供了更增强大的原生字符串,使用 """ 括起来,内部没有转义而且能够包含换行和任何其余字符。.net

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

注意的是,原生字符串和转义字符串内部都支持模板。 若是咱们须要在原生字符串中表示$字符,咱们须要改形成${'$'}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) {}
复制代码

参考资料

源代码

相关示例完整代码: spring-kotlin-samples

(完,转载请注明做者及出处。)

更多精彩文章,尽在「服务端思惟」!

相关文章
相关标签/搜索