Kotlin In Action学习笔记1

先来说说一些Kotlin的基本特点

  • Kotlin和Java一样是一门静态语言,这意味着所有表达式的类型在编译期已经确定了。
  • Kotlin的运行时库体积非常小,所以不会导致你使用了Kotlin以后程序体积增大很多
  • Kotlin程序的代码简洁,这是Kotlin最让人印象深刻的地方,这得益于Kotlin简洁的语法和函数式编程在Kotlin中的广泛使用。当然语法更简洁,必然就需要编译器做更多的事情,所以Kotlin完全重新编译一个工程的速度是比Java要慢点,不过在增加编译点时候却能够提供更快的编译性能。
  • Kotlin另一个亮点是空安全。我们不必再为冷不丁冒出来的空指针异常而烦恼,因为Kotlin默认是空安全的,他会在编译阶段就检查潜在的空指针异常并提示你,而不是在运行期以让程序崩溃的方式来警告你。
  • 和Java良好的互操作性。Kotlin一开始就瞄准了与现有的Java项目的集成问题,所以官方说他们能完美的与Java实现相互操作。

对于这点,我个人还是有一些疑虑的,毕竟Kotlin语言中有不少的特性在Java中是没有的,虽然的确能够做到相互操作,不过需要开发人员在遇到这些特性的时候做一些特殊的处理,否则会发生一些与预期不符的行为。这些以后我们谈到相关特性的时候再来讨论。

既然是学习笔记,接下来还是来点实际的吧,我们来看看Kotlin基本语法中的一些特别的点。

  1. 有且只有表达式体函数的返回类型可以省略:
    比如,
    fun max(a: Int, b: Int): Int = if (a > b) a else b

我们可以写成

    fun max(a: Int, b: Int) = if (a > b) a else b
  1. 在Koltin中你可以像脚本语言中一样,在双引号字符串里引用其他变量
   var name = "Leonard Messi"
   println("Hello, $name!")

你还可以这样写

    println("Hello, ${args[0]}!")  // args是一个数组

甚至还可以这样写

    println("Hello, ${if (args.size > 0) args[0] else "someone"}!")
  1. 在Kotlin中,if是表达式,而不是语句,它和 Java 中的三元运算符相似:(a > b) ? a : b,所以我们就有这样的代码
var name = if (a > b) a else b
  1. 如果你想定义全局静态常量,那你需要用到const关键字
const val UNIX_LINE_SEPARATOR = "\n"

它等价于

public static final String  UNIX_LINE_SEPARATOR = "\n";
  1. Kotlin中的可变参数于Java类似,但语法略有不同,我们不使用三个点,而是vararg关键字
fun listOf<T>(vararg values: T): List<T> { ... }
val list = listOf(2, 3, 5, 7, 11)
  1. 展开操作符,是不是很方便?
fun main(args: Array<String>) {
       val list = listOf("args: ", *args) //展开运算符展开数组内容
       println(list)
}
  1. 解构声明,同时定义多个变量
val map = mapOf(1 to "one", 7 to "seven", 53 to "fifty-three")  // define a map
val (number, name) = 1 to "one"

或者

for ((index, element) in collection.withIndex()) {
        println("$index: $element")
}
  1. 局部方法,可以让代码更整洁

  2. 安全调用运算符:当你使用可空类型变量又不想空指针异常将整个程序搞崩溃时使用

    fun printAllCaps(s: String?) {
        // allCaps 可能是 null
        val allCaps: String? = s?.toUpperCase()
        println(allCaps)
    }
   
    >> printAllCaps(null)
    null
  1. Elvis运算符 ?:,它通常与安全调用运算符结合使用
fun strLenSafe(s: String?): Int = s?.length ?: 0

如果s?.length为null,那么函数的返回值是0。通常我们在第二个表达式的地方处理异常情况,比如throw一个异常,返回并退出函数等。

  1. 安全转换符as? : as?运算符尝试把值转换成指定的类型,如果值不是合适的类型就返回null
val otherPerson = o as? Person ?: return false // 这里也结合了Elvis运算符一起使用
  1. 非空断言符 !!,类似Java中 调用Assert语句
fun ignoreNulls(s: String?) {
       // 如果发现s真的为空,会抛出空指针异常
       val sNotNull: String = s!! 
       println(sNotNull.length)
}

因为Kotlin是空安全的,空指针并不出导致程序异常退出,非空断言在你需要显示的抛出异常时派上用场。(我记得某位同事在当初看到空安全概念时,提到过这个问题)

  1. let函数,可以被任何对象调用,但只有当调用对象非空时,才会执行后续的表达式操作,并且可以将调用对象作为表达式的参数使用;如果调用对象为空,将什么都不做
email?.let { email -> sendEmailTo(email) }
  1. 延迟属性的初始化,我们使用lateinit关键字
private lateinit var myService: MyService

这样,属性myService的初始化就需要一定要在构造函数中去完成了。但要注意延迟初始化的属性都是var,因为你需要在构造方法外修改它的值。

  1. 可空类型的扩展函数
    在 Java 中,this永远是非空的,因为它引用的是当前你所在这个类的实例。而 在 Kotlin 中,这并不永远成立:在可空类型的扩展函数里,this可以为null。

  2. 数据类型的一些特点

  • Kotlin 中所有基本数据类型都是引用对象,而any是所有对象的跟,类似Object
  • Kotlin 新增了一种Unit类型,类似void,但Unit可以作为类型参数
  • Nothing 类型,没有任何值,在异常处理中有用
  1. 数组: Koltin中用一个类 Array<>来表示
Array<String>(26) { i -> ('a' + i).toString() }

Kotlin标准库提供给了很多方便函数,toTypedArrayforEachIndexed

  1. 集合(关于集合,内容不少,详情请参考《Kotlin In Action》)
  • Kotlin 提供的大量的集合操作函数,使用非常方便,比如filter,map,sort,sum,filterNotNull等
  • Kotlin 使用Java提供的集合为基础,增加了序列(sequence,用于实现惰性操作)
  • 每一个Java集合在Kotlin中都有两个版本,一个只读,一个可修改

总结:
以上是对《Kotlin In Action》第一部分的内容当中的一些要点做了一个梳理,仅供参考。由于篇幅有限,不可能对每个点进行非常详细的阐述,如果想要了解更多的细节,请阅读原书。作者参与翻译的中文版《Kotlin实战》已经翻译完毕,已经在2017年8月正式上市,这是国内第一本权威且全面深入的kotlin教程,值得你拥有!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容