本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2016/01/kotlin-android

Android开发人员在语言限制方面面临着一个困境。

众所周知,眼下的Android开发仅仅支持Java 6(语言本身从Java 7開始进行了一些改进),因此我们每天仅仅能使用一种古老的语言来进行开发,这极大地减少了我们的生产力,同一时候也迫使我们不得不编写大量的样板与脆弱的代码。然而这种代码是难以阅读和维护的。

幸运的是,Android程序是执行在Java虚拟机之上的,因此从技术上来说,能够执行在JVM之上的一切都可用于开发Android应用。如今已经有许多能够生成JVM能够执行的字节码的语言,当中一些语言開始崭露头角并逐步流行起来,Kotlin就是当中的佼佼者。

何为Kotlin?

Kotlin是一门执行在JVM之上的语言。它由Jetbrains创建。而Jetbrains则是诸多强大的工具(如知名的Java IDE IntelliJ IDEA)背后的公司。

Kotlin是一门很easy的语言,其主要目标之中的一个就是提供强大语言的同一时候又保持简单且精简的语法。其主要特性例如以下所看到的:

  • 轻量级:这一点对于Android来说很重要。项目所须要的库应该尽可能的小。Android对于方法数量有严格的限制,Kotlin仅仅额外添加了大约6000个方法。

  • 互操作:Kotlin可与Java语言无缝通信。这意味着我们能够在Kotlin代码中使用不论什么已有的Java库;因此,即便这门语言还很年轻,但却已经能够使用成百上千的库了。除此之外,Kotlin代码还能够为Java代码所用,这意味着我们能够使用这两种语言来构建软件。

    你能够使用Kotlin开发新特性。同一时候使用Java实现代码基的其它部分。

  • 强类型:我们很少须要在代码中指定类型,由于编译器能够在绝大多数情况下判断出变量或是函数返回值的类型。这样就能获得两个优点:简洁与安全。
  • Null安全:Java最大的一个问题就是null。假设没有对变量或是參数进行null判断,那么程序当中就有可能抛出大量的NullPointerException,然而在编码时这些又是难以检測到的。Kotlin使用了显式的null,这会强制我们在必要时进行null检查。

眼下Kotlin的版本号是1.0.0 Beta 3。只是正式版很快就会公布。它全然能够用在生产当中。如今就已经有许多公司成功应用上了Kotlin。

为何说Kotlin很适合于Android?

基本上。这是由于Kotlin的全部特性都很适合于Android生态圈。

Kotlin的库很小,我们在开发过程中不会引入额外的成本。

其大小相当于support-v4库。我们在许多项目中所使用的库都比Kotlin大。

除此之外。Android Studio(官方的Android IDE)是基于IntelliJ构建的。这意味着我们的IDE对该语言提供了很棒的支持。我们能够很快就配置好项目,而且使用熟悉的IDE进行开发。

我们能够继续使用Gradle以及IDE所提供的各种执行与调试特性。这与使用Java开发应用别无二致。归功于互操作性,我们能够在Kotlin代码中使用Android SDK而不会遇到不论什么问题。实际上,部分SDK使用起来会变得更加简单,这是由于互操作性是很智能的,比方说它能够将getters与setters映射到Kotlin属性上。我们也能够以闭包的形式编写监听器。

怎样在Android开发中使用Kotlin?

过程很easy,仅仅需依照以下的步骤来就可以:

  • 从IDE plugins中下载Kotlin插件
  • 在模块中创建Kotlin类
  • 使用“Configure Kotlin in Project…”
  • 開始编码

Kotlin的一些特性

Kotlin拥有大量很打动人心的特性,这里无法一一进行介绍,只是我们来看一下当中最为重要的一些。

Null安全

如前所述,Kotlin是null安全的。

假设一个类型可能为null,那么我们就须要在类型后面加上一个?

。这样,每次在使用该类型的变量时。我们都须要进行null检查。

比方说,例如以下代码将无法编译通过:

var artist: Artist? = null?artist.print()

第2行会显示一个错误,由于没有对变量进行null检查。我们能够这样做:

if (artist != null) {? artist.print()?}

这展示了Kotlin另一个出色的特性:智能类型转换。

假设检查了变量的类型,那就无需在检查作用域中对其进行类型转换。这样。我们如今就能够在if中将artist作为Artist类型的变量了。

这对于其它检查也是适用的。另一种更简单的方式来检查null,即在调用对象的函数前使用?

。甚至还能够通过Elvis运算符?提供第二种做法:

val name = artist?.name ?

: ""

数据类

在Java中,假设想要创建数据类或是POJO类(仅仅保存了一些状态的类),我们须要创建一个拥有大量字段、getters与setters的类,或许还要提供toString与equals方法:

public class Artist { private long id; private String name; private String url; private String mbid; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getMbid() { return mbid; } public void setMbid(String mbid) { this.mbid = mbid; } @Override public String toString() { return "Artist{" + "id=" + id + ", name='" + name + '\'' + ", url='" + url + '\'' + ", mbid='" + mbid + '\'' + '}'; }}

在Kotlin中,上述代码能够写成以下这样:

data class Artist (?

var id: Long, var name: String, var url: String, var mbid: String)

Kotlin使用属性而非字段。

基本上,属性就是字段加上其getter与setter。

互操作

Kotlin提供了一些很棒的互操作特性。这对于Android开发帮助很大。当中之中的一个就是拥有单个方法的接口与lambda表达式之间的映射。这样,以下这个单击监听器:

view.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View) { toast("Click")? }?})

能够写成这样:

view.setOnClickListener { toast("Click") }

此外。getters与setters都会自己主动映射到属性上。这并不会造成性能上的损失,由于字节码实际上仅仅是调用原来的getters与setters。

例如以下代码所看到的:

supportActionBar.title = titletextView.text = titlecontactsList.adapter = ContactsAdapter()

Lambda表达式

Lambda表达式会在极大程度上精简代码,只是重要的是借助于Lambda表达式。我们能够做到之前无法实现或是实现起来很麻烦的事情。借助于Lambda表达式,我们能够以一种更加函数式的方式来思考问题。Lambda表达式事实上就是一种指定类型,而且该类型定义了一个函数的方式。比方说。我们能够像以下这样定义一个变量:

val listener: (View) -> Boolean

该变量能够声明一个函数。它接收一个view并返回这个函数。

我们须要通过闭包的方式来定义函数的行为:

val listener = { view: View -> view is TextView }

上面这个函数会接收一个View,假设该view是TextView的实例,那么它就会返回true。由于编译器能够判断出类型。因此我们无需指定。还能够更加明白一些:

val listener: (View) -> Boolean = { view -> view is TextView }

借助于Lambda表达式,我们能够抛弃回调接口的使用。仅仅需设置希望后面会被调用的函数就可以:

fun asyncOperation(value: Int, callback: (Boolean) -> Unit) { ... callback(true)?

} asyncOperation(5) { result -> println("result: $result") }

另一种更加简洁的方式,假设函数仅仅接收一个參数。那就能够使用保留字it:

asyncOperation(5) { println("result: $it") }

Anko

Anko是Kotlin团队开发的一个库,旨在简化Android开发。其主要目标在于提供一个DSL,使用Kotlin代码来声明视图:

verticalLayout { val name = editText() button("Say Hello") { onClick { toast("Hello, ${name.text}!") } }}

它还提供了其它一些很实用的特性。比方说,导航到其它Activity:

startActivity("id" to res.id, "name" to res.name)

总结

如你所见。Kotlin在许多方面都简化了Android的开发工作。它会提升你的生产力,而且能够通过很不同且更加简单的方式来解决一些常见的问题。

Android开发人员应该知道的Kotlin的更多相关文章

  1. C#开发人员应该知道的13件事情

    本文讲述了C#开发人员应该了解到的13件事情,希望对C#开发人员有所帮助. 1. 开发过程 开发过程是错误和缺陷开始的地方.使用工具可以帮助你在发布之后,解决掉一些问题. 编码标准 遵照编码标准可以编 ...

  2. 每个JavaScript开发人员应该知道的33个概念

    每个JavaScript开发人员应该知道的33个概念 介绍 创建此存储库的目的是帮助开发人员在JavaScript中掌握他们的概念.这不是一项要求,而是未来研究的指南.它基于Stephen Curti ...

  3. Android开发人员必知的开发资源

    developer.android.com 官方开发人员网站推荐资源 在动手编写第一个 Android 应用之前,用心读一读 Android Design 章节.尤其是以下的这些文章: Devices ...

  4. 对于JavaScript的函数.NET开发人员应该知道的11件事

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 昨天小感冒今天重感冒,也不能长篇大论.如果你是.NET开发人员,在进入前端开发领域的时候,对 ...

  5. 每个Web开发人员应该知道的12个终端命令

    Tips 原文作者:Danny Markov 原文地址:12 Terminal Commands Every Web Developer Should Know About 终端是开发人员的武器库中最 ...

  6. ASP.NET 开发人员应该知道的8个网站

    1.CodeProject http://www.codeproject.com/ 2.DotNetNuke 3.4GuysFromRolla 4.DevSource 5.DevX http://ww ...

  7. 开发人员应该知道的SEO

    搜索引擎是如何工作的 > 如果你有时间,可以读一下谷歌的框架: http://infolab.stanford.edu/~backrub/google.html > 这是一个老的,有些过时 ...

  8. 在开发第一个Android应用之前需要知道的5件事:

    你能否详细讲述一下,在开发Android应用过程中每一阶段要用到的技能和编程语言? 建立一个Android应用程序可以归结为两个主要技能/语言:Java和Android系统.Java是Android的 ...

  9. Android 程序员必须知道的 53 个知识点

    1. android 单实例运行方法 我们都知道 Android 平台没有任务管理器,而内部 App 维护者一个 Activity history stack 来实现窗口显示和销毁,对于常规从快捷方式 ...

随机推荐

  1. 实现人脸识别性别之路---网页上的video标签

    <video> 元素支持三种视频格式: MP4, WebM, 和 Ogg.但是,不同的浏览器对视频格式的支持也不一致,因此为了让浏览器都适应,我们使用source属性来对视频文件格式定义 ...

  2. C# ArcGIS Engine 使当前选中的操作失效(清除当前鼠标事件)

    问题描述: 前提:我用的ENGINE9.3开发,拖了一个ToolbarControl控件,加了一些常用操作的工具(平移,放大,缩小)在上边. 问题:我做了一个增加点的按钮.当我平移完地图之后,点击增加 ...

  3. 视图中使用ROWNUM要注意

    昨天晚上帮一位兄弟优化一个ebs的sql. sql有好几百行. SQL的样子是select .... from 视图 where ....过滤条件 视图的代码贴出来就不给大家看了,比較长.另外设计保密 ...

  4. 归并排序_分治算法 (白书P226)

    #include<iostream> #include<cstdio> #include<algorithm> using namespace std; int a ...

  5. POJ 1269 Intersecting Lines 直线交

    不知道谁转的计算几何题集里面有这个题...标题还写的是基本线段求交... 结果题都没看就直接敲了个线段交...各种姿势WA一遍以后发现题意根本不是线段交而是直线交...白改了那个模板... 乱发文的同 ...

  6. 【Mysql】将Excel表导入至Mysql的当中一张表

    如果表格有A(整型字段).B(整型字段).C(字符串数据)三列数据,希望导入到Mysql中数据库中表格table.table中须要插入的字段各自是col1,col2,col3 1.在随意一列,如果在D ...

  7. JXL.jar简单封装Excel读写操作

    1.分析 一个excel文件能够有多页,每页excel中能够有多行,每行中能够有多列.用面向对象的思想能够把一行中的某列看作是一个String对象,一行看作是一个包括多个列的对象.一页是包括多行的对面 ...

  8. 编程算法 - 水洼的数量 代码(C)

    水洼的数量 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有一个大小为N*M的园子, 雨后起了积水. 八连通的积水被觉得是连接在一起的. 请求 ...

  9. ContentValues的使用

    什么是 ContentValues类? ContentValues类和 Hashtable比较类似,它也是负责存储一些名值对,但是它存储的名值对当中的名是一个String类型,而值都是基本类型. 插入 ...

  10. vim-复制、粘贴

    选中某些行,可以在命令行模式下执行如下操作 v(小写),按上下左右键,可以选中某些行 V(大写),按上下键,这时候可以直接选中光标所在的行 ctrl+v(小写),可以选中一个矩形区域 取消选中,这些指 ...