博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Kotlin的语法糖(一)基础篇
阅读量:5839 次
发布时间:2019-06-18

本文共 3129 字,大约阅读时间需要 10 分钟。

原文地址:

博客地址:

欢迎转载,转载请注明作者及出处,谢谢!

基本类型

局部变量与可变变量

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
) { val x: Int = 21 var y: Int = 11 val z = 21 // ⾃动推断}复制代码

同一性与相等性

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

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

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

原生字符串

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

fun main(args: Array
) { 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?.sizename?.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
) { 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) = personfor ((key, value) in map) {}复制代码

参考资料

  • 《Kotlin 实战》(Dmitry Jemerov)

源代码

相关示例完整代码:

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

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

你可能感兴趣的文章
PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.4. 异步命令处理
查看>>
MySQL:show slave status 关键值和MGRrelay log的清理策略
查看>>
时隔一年,jQuery 发布 3.4.0 版本
查看>>
在百度搜索里展现网站LOGO
查看>>
WPF 中的三维文字[转贴]
查看>>
Ruby(1):入门
查看>>
查看服务器 慢 卡 原因 Linux
查看>>
Ubuntu 16.04配置SSL免费证书
查看>>
Confluence 6 如何备份和恢复
查看>>
使用高速通道加速iOS版本审核
查看>>
学jstl,看这一篇就够了
查看>>
php使用原生SQL链接数据库
查看>>
计算机网络的性能指标及计算例题
查看>>
手机报表参数和结果在一个页面展示
查看>>
PostgreSQL 分区表、继承表 记录去重方法
查看>>
剑指offer-学习笔记
查看>>
TableStore发布多元索引功能,打造统一的在线数据平台
查看>>
AI学习笔记——End-to-End(端到端)的深度学习
查看>>
云栖黑科技揭秘 | 眼科大夫如何应用5G+8K完成远程会诊
查看>>
mysql-数据(记录)相关操作(增删改查)及权限管理
查看>>