Kotlin 是一门非常优秀的语言,兼容了 N 多种语言的优点,学习 Kotlin 有助于提升我们多层编程开发的认识。
Kotlin 是静态类型的开源编程语言,可以有效地运行在 Java虚拟机(JVM)上。Kotlin 由 JetBrains 开发,并得到谷歌的强力支持。
一、从类开始
1.1 导包
与 Java 一样,Kotlin 也含有默认导入的特性。Kotlin 的每个文件都默认导入了如下常用包:
-- kotlin.*
-- kotlin.annotation.*
-- kotlin.collections.*
-- kotlin.comparisons.*
-- kotlin.io.*
-- kotlin.ranges.*
-- kotlin.sequences.*
-- kotlin.text.*
Kotlin 的导包方式和 Java 也类似,但有一点,Kotlin 不支持静态导入。Kotlin 为什么不支持静态导入?因为静态导入会增加代码的阅读成本。
1.2 函数声明
fun Kotlin 中用关键字 fun 声明函数。
override fun getRandom(type: String): Observable<JsonResult<List<FuckGoods>>> { return api.getRandom(type) }
Kotlin 为什么使用 fun 来声明函数?为什么不是 function? 或者 def?
JetBrains 团队说: “We use ‘fun’ because we like it – and yes, we do know what the word means in English.”
我们使用 “fun” 因为我们喜欢它,而且我们知道这个词在英语中是啥意思!
“fun” 在英语中是什么意思? 来自谷歌翻译的 fun 的翻译: 动词 开玩笑,名词 玩笑。
1.3 参数
参数声明
Kotlin 的参数使用 Pascal 符号定义,参数之间和 java 类似通过 ” , ” 分隔,参数需要指明类型。
fun test(count: Int, test2: Int) { }
为什么 Kotlin 像 Pascal 一样,参数声明类型要在参数名后面?count: Int
Rob Pike 曾解释过这个问题: 因为这样更加清晰易懂,当然,我觉得这样存在很大的争议,不过也和工程师自身的习惯有关系。
默认参数
Kotlin 参数可以设置默认值,当需要忽略该参数的时候可以使用参数的默认值。Like this:
off: Int = 0
fun read(b: Array<Byte>, off: Int = 0, len: Int = b.size ) { ... }
空返回值
在 Java 中返回空关键字为 void,在 Kotlin 中的空返回值为 Unit,并且可以省略 .Unit 和 void 不同,Unit 是个真实的类并且是个单例。
// 不省略
fun printHello(name: String?): Unit { ...}
// 省略
fun printHello(name: String?) { ...}
为什么使用Unit?
“Unit” just stands for “something that has only one value”, it’s a traditional name, comes from functional languages. I agree that this name is not very intuitive, but we failed to invent a better name.
“Unit” 代表 “只有一个值”,它是一个来自函数式语言的传统的名称。我同意这个名字不是很直观,但我们没有想到一个更好的名字。
1.4 局部变量
Kotlin 局部变量分为 val 和 var。
var 关键字声明可变属性,和 Java 变量声明类似;
val 关键字声明只读属性,和 Java 中 final 变量类似,在初始化时需要赋值,以后不能改变。更多的应该使用 val 关键字。
val a: Int = 1 var x = 5
为什么使用 val 关键字?
val 具有 Immutable 或 readonly 的特性,一旦创建,不可改变。没有竞争条件,没有并发问题,无需去同步,保证了线程安全,不需要担心空安全问题。
为什么是 val 和 var?
因为 val 是 value 的缩写,而 var 是 variable。
二、特性
2.1 有趣的冒号
从语法上来看,Kotlin 大量使用了冒号(:)这一符号,可以总结一下,这个冒号在 Kotlin 中究竟代表什么。
考虑下面四种场景:
-
在变量定义中,代表变量的类型
-
在类定义中,代表基类的类型
-
在函数定义中,代表函数返回值的类型
-
在匿名对象中,代表对象的类型
2.2 字符串模板
Kotlin 中允许字符串中包含 “$” 开头嵌入表达式。
在 Java 中我们可能需要这样定义来拼接字符串:
String message = "n = " + n;
但是在 Kotlin 中,我们可以直接使用 “$” 拼接”:
val message = "n = $n"
很显然,使用字符串模板,可以提高我们的开发效率。
2.3 条件表达式
这是一个普通的条件判断语句。
fun maxOf(a: Int, b: Int): Int {
if (a > b) {
return a
} else {
return b
}
}
在 Kotlin 中,if 表达式具有返回值,故可以表述成如下方式:
fun maxOf(a: Int, b: Int) = if (a > b) a else b
2.4 关于空安全
空安全性是 Kotlin 的一大特色,在 Java 中,NPE (NullPointerException) 是常客,但是在 Kotlin 中,我们将会看到 NPE。
对于可为空的变量,我们必须用 “?” 将其特殊声明为一个具有空值的变量:
var b: String? = "abc"
而正常使用是这样的
var b: String = "abc"
<