Android开发新选择:Kotlin

iOS 开发已经有了新的开发语言:Swift,Android 阵营依旧还是 Java。在 Andriod 开发中我们有没有其他语言可以选择呢?当然有,今天就给大家介绍 Android 的一种开发语言 Kotlin。

何为 Kotlin?

Kotlin是JetBrains公司开发的基于JVM的一门静态语言,可用于开发 JavaEE,Android,Web等。整体来说,Kotlin有以下几个特点:

简洁:大量重复的模版代码不用写了,如 JavaBean/POJO 可以用 Kotlin 的 data class 替代。

安全:空指针等异常在语言层面被处理掉了,不用去写各种判空操作。

函数式编程:lambda,filter,map,reduce。有了这些特性,效率又提高了不少。

与 Java 完美结合:Kotlin 可以完美复用现有 Java 代码,不用去重写,反过来也适用。

针对 Android 开发:终于可以不用一遍又一遍的去写 findViewById 了(也不需要用注解的方式)。

Kotlin 初见

简单介绍完 Kotlin 之后,我们用一个简单的例子来体验一下 Kotlin。

1)配置开发环境

由于 Android Studio 默认是不安装 Kotlin plugin 的,首先我们需要安装 Kotlin plugin。

安装完后重启,创建一个普通的 Android Project 项目;然后打开我们的 MainActivity;接着打开菜单 Code->Convert Java File To Kotlin File。完成之后,我们就可以使用 Kotlin 写代码了。

当 Project 转换为 Kotlin 项目时,项目中的 build.gradle 文件会发生改变。

Project/build.gradle:

Project/app/build.gradle:

项目环境配置完毕,接下来我们就来编写一行代码。Android 布局文件中有一个 Button 和一个 TextView,代码实现点击 Button 时改变 TextView 的值

一行代码即可实现,而在Java 中我们是这样实现如上功能:

为何使用 Kotlin 精简掉那么多代码?

首先就是我们的 layout 文件中所有的控件被当成类一样 import 进来。import kotlinx.android.synthetic.main.activity_main.*控件的 id 就是其变量名,我们再也不用像以前一样先要声明这个控件,然后再去 findViewById 了。

在 Kotlin 中lambda 表达式是自带的,我们可以用 lambda 表达式去写各种 Listener 来减少代码量。

Kotlin 快速入门

这里我介绍一些Kotlin 最常用和简单的用法:

1) 定义变量和常量

2)方法/函数

方法的定义和 Java 略有不同。方法参数名在前,参数类型在后,返回值也是写在方法参数定义之后。

重载父类方法:

方法扩展:

Kotlin 可以在不修改原始类的情况下,给类增加新的功能(方法),如下面代码给Button 新添加了一个方法 doubleClick:

使用起来很简单,就和调用 Button 自有方法一样:

当使用其他类库时,我们觉得这个类库功能不够强大,那么就可以直接给这个类添加方法,而不需要通过继承去实现。

3)List

用法和 Java 中的 List 用法基本一样。不同的是,Kotlin 的 List 添加了操作 List 的高阶函数,可以更方便的对 List 进行操作。

4)Map

Map 的用法和 Java 的 Map 也基本一样,不同的是,mapOf 方法生成的 map 是不可以添加和删除元素的,mutableMapOf 方法生成的 Map 是可以修改的。Map 中也添加了诸多高阶函数可以更方便的对 Map 进行修改:map.map,map.flatMap,map.filter 等等,使用起来和 RxJava 用法很像。

5)条件语句以及循环语句

Kotlin 条件语句中if..else..语法结构和 Java 基本一致,取消了 switch 语句,新增了一个功能更加强大的when 语句来代替 switch。示例,根据成绩得到相应的分数评级:

Kotlin 特性

Kotlin 中有一些 Java 中没有的,能够提高开发效率的新特性。

1)数据类(Data Class)

在 Android 实际开发中,我们需要给每一个 API 返回的数据定义一个数据类,如下:

而在 Kotlin 的 Data Class 中我们是这样写的:

一行代码就搞定!Java 中写 JavaBean 时,我们需要去写 equals()方法,hashCode()方法,toString()方法。如果写方法的过程中出了问题,那么在 HashMap 中,我们很有可能就会遇到隐蔽的内存泄漏问题,这种问题很难调试。

而 Kotlin 的 data class 会自动根据内容去生成这几个方法,不需要我们再写 get/set equals 等烦人的方法了。

2)空安全(Null Safety)

每一个开发人员都会遇到这样的问题:在使用某个对象时,我们必须得考虑这个对象是否为空。如果对象可能为空,我们不得不需要写 if(object != null) 之类的代码,如果判断条件写反,或者少写了一个条件判断,应用就会在 QA 运行时 Crash 了。我们千辛万苦写的代码,到头来却被各种 NullPointerException 害苦。而现在 Kotlin Null Safety 能帮助我们节省时间,脱离空指针的苦海。

Kotlin 定义变量有两种方式,可以为 Null 和不可以为 Null。在变量类型后面加?表示该变量可以为 Null

使用一个变量的三种方法:

至此,再也不用担心哪里漏写了判空操作而引发空指针异常了。

3)函数式编程

对于函数式编程,Kotlin 比 Java 有了很大的提升。lambda 表达式和众多的内置高阶函数,可以使我们的开发效率以及代码的可读性有了进一步的提高。这里介绍比较常用的几个高阶函数:

1.lambda 表达式

在 Java8 中已经有 lambda 了,但是我们想要在 Andorid 开发中应用这个特性,需用 jack 来编译。目前 jack 还不是很完整,而且很多插件也不支持 jack。所以我们只能退而求其次使用 retroLambda。

现在 Kotlin 纯天然支持 lambda,不需要换编译工具,也不需要使用第三方插件,而且比前者更好用。本文开头第一个例子就是使用 lambda 来完成的。

2.map

map 是一个高阶函数,参数是一个变换函数,将变换函数作用于集合中的每一项元素中,从而返回一个新的集合。使用 map 对集合中的每一项元素做自乘(f(x) = x*x)。实现如下:

3.reduce

reduce 同样是一个高阶函数,参数是一个变换函数,该变换函数有两个参数,将该变换函数作用于集合中的元素上,把返回的结果继续和下一个元素做累计。例如对集合中的所有元素做累加计算:

4.filter

filter 是 Kotlin 在集合中加入的高阶函数,方便对集合进行筛选操作。示例,筛选 List 中的偶数:

Map 集合对应的 filter 是 filterKey 和 filterValue,用法和 List 的 filter 是基本一致的。

小结

由于篇幅所限,Kotlin 还有诸多特性(类扩展,DSL 等)并未介绍,请期待后续分享。

Kotlin 有诸多的优点,我们该不该学习、使用呢?Kotlin 是值得我们学习的,但是若要应用于线上项目,还是需要我们慎重考虑。毕竟 Android 的官方开发语言仍然是 Java,万一后面 Android 发布个新特性,Kotlin 不支持就悲剧了。

本文作者:房建斌 (点融黑帮),就职于点融网工程部 Client  team,Android 开发工程师一枚,专注 java 和 android 技术。

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

推荐阅读更多精彩内容