微信号:infoqchina

介绍:有内容的技术社区媒体

语言之争|如果安卓这样对抗苹果Swift……

2015-07-02 10:41 谢丽

Kotlin是一门与Swift类似的静态类型JVM语言,由JetBrains设计开发并开源。与Java相比,Kotlin的语法更简洁、更具表达性,而且提供了更多的特性,比如,高阶函数、操作符重载、字符串模板。它与Java高度可互操作,可以同时用在一个项目中。

按照JetBrains的说法,根据他们多年的Java平台开发经验,他们认为Java编程语言有一定的局限性和问题,而且由于需要向后兼容,它们不可能或很难得到解决。因此,他们创建了Kotlin项目,主要目标是:

创建一种兼容Java的语言

编译速度至少同Java一样快

比Java更安全

比Java更简洁

比最成熟的竞争者Scala还简单


Ashraff Hathibelagal是一名喜欢研究新框架和SDK的独立开发者。近日,他撰文介绍了Kotlin的一些语法。按照他的说法,一个合格的Java程序员可以在很短的时间内学会使用Kotlin。

类与构造函数

Kotlin创建类的方式与Java类似,比如下面的代码创建了一个有三个属性的Person类:

class Person{ var name: String = "" var age: Int = 0 var college: String? = null}


可以看到,Kotlin的变量声明方式略有些不同。在Kotline中,声明变量必须使用关键字var,而如果要创建一个只读/只赋值一次的变量,则需要使用val代替它。另外,为了实现“空安全(null safety)”,Kotlin对可以为空的变量和不可以为空的变量作了区分。在上述代码中,变量nameage不可为空,而表明变量college可以为空。定义完类之后,创建实例就非常简单了:


var jake = Person()


注意,Kotlin没有关键字new。实例创建完成后,就可以像在Java中一样为变量赋值了:


jake.name = "Jake Hill"jake.age = 24jake.college = "Stephen's College"


变量可以采用上述方式赋值,也可以通过构造函数赋值,但后者是一种更好的编码实践。在Kotlin中,创建这样的一个构造函数非常简单:


class Person(var name: String, var age: Int, var college: String?) {}


而实际上,由于构造函数中没有其它操作,所以花括号也可以省略,代码变得相当简洁:


class Person(var name: String, var age: Int, var college: String?)var jake = Person("Jake Hill", 24, "Stephen's College")


上述代码中的构造函数是类头的一部分,称为主构造函数。在Kotlin中,还可以使用constructor关键字创建辅助构造函数,例如,下面的代码增加了一个辅助构造函数初始化变量email


class Person(var name: String, var age: Int, var college: String?) { var email: String = "" constructor(name:String, age:Int, college: String?, email: String) : this(name, age, college) { this.email = email }}


Kotlin允许创建派生类,但要遵循如下规则:


必须使用代替Java中的extends关键字

基类头必须有open注解

基类必须有一个带参数的构造函数,派生类要在它自己的头中初始化那些参数


比如下面的代码创建了一个名为Empoyee的派生类:

open class Person(var name: String, var age: Int, var college: String?) { ...}class Employee(name: String, age: Int, college: String?, var company: String) : Person(name, age, college) {}


函数与扩展


在派生就有重载。与类的派生一样,允许重载的方法要有open注解,而在派生类中重载时要使用override注解。例如,下面是在Employee类中重载Person类的isEligibleToVote方法的代码:


override fun isEligibleToVote(): Boolean { return true}


除了改变类的已有行为,Kotlin还允许开发者在不修改类的原始定义的情况下实现对类的扩展,如下面的代码为Person类增加了一个名为isTeenager的扩展:


fun Person.isTeenager(): Boolean { return age in 13..19}


在需要扩展来自其它项目的类时,这个特性特别有用。

上面提到的函数都与Java中的函数类似,但Kotlin还支持其它类型的函数。如果一个函数返回单个表达式的值,那么可以使用=来定义函数。下面是一个创建单表达式函数的例子:

fun isOctogenarian(): Boolean = age in 80 .. 89


Kotlin还支持高阶函数和Lambda表达式。例如,lambda表达式{x,y->x+y}可以像下面这样给一个变量赋值:

val sumLambda: (Int, Int) -> Int = {x,y -> x+y}


而下面的高阶函数将上述表达式作为一个参数,并将表达式的计算结果翻倍:

fun doubleTheResult(x:Int, y:Int, f:(Int, Int)->Int): Int { return f(x,y) * 2}


该函数可以使用下面的其中一种方式调用:

val result1 = doubleTheResult(3, 4, sumLambda)


val result2 = doubleTheResult(3, 4, {x,y -> x+y})


范围表达式

在Kotlin中,范围表达式用的比较多。范围创建只需要..操作符,例如:

val r1 = 1..5//该范围包含数值1,2,3,4,5


如果创建一个降序范围,则需要使用downTo函数,例如:

val r2 = 5 downTo 1//该范围包含数值5,4,3,2,1


如果步长不是1,则需要使用step函数,例如:

val r3 = 5 downTo 1 step 2//该范围包含数值5,3,1


条件结构


在Kotlin中,if是一个表达式,根据条件是否满足返回不同的值,例如,下面的代码将isEligibleToVote设置为“Yes”

var age = 20val isEligibleToVote = if(age > 18) "Yes" else "No"


when表达式相当于Java的switch,但功能更强大,例如,下面的代码将typeOfPerson设置为“Teenager”:

val age = 17val typeOfPerson = when(age){ 0 -> "New born" in 1..12 -> "Child" in 13..19 -> "Teenager" else -> "Adult"}


循环结构


Kotlin使用for..in遍历数组、集合及其它提供了迭代器的数据结构,语法同Java几乎完全相同,只是用in操作符取代了:操作符,例如,下面的代码将遍历一个String对象数组:

val names = arrayOf("Jake", "Jill", "Ashley", "Bill")for (name in names) { println(name)}


whiledo..while循环的语法与Java完全相同。

字符串模板

Kotlin允许在字符串中嵌入变量和表达式,例如:

val name = "Bob"println("My name is ${name}") //打印"My name is Bob"val a = 10val b = 20println("The sum is ${a+b}") //打印"The sum is 30"


此外,Kotlin与Java高度可互操作。Kotlin可以用一种自然的方式调用现有的Java代码,而Java也很容易调用Kotlin代码。同时,Kotlin也可以与JavaScript互操作。



回复关键词查看对应内容:

React | 架构师 | 运维 | 云 | 开源 | Kubernetes | 架构 | 人工智能 | Kafka | Docker | Netty | CoreOS | QCon | Github | Swift | 敏捷 | 语言 | 程序员 | 实践 | 物联网 |




如果想要评论本篇文章,直接戳右下角的“评论”发表观点和建议,我们一直在寻找的技术人中的KOL,也许就是你!聊聊|有颜值,就不拼,只求和你谈谈心,点击文字可进入文章了解InfoQ技术意见领袖养成计划。


版权及转载声明:

极客邦科技专注为技术人提供优质内容传播。尊重作者、译者、及InfoQ网站编辑的劳动,所有内容仅供学习交流传播,不支持盗用。未经许可,禁止转载。若转载,需予以告知,并注明出处。


【号外】

极客邦科技官方顶级账号已开通,关注极客资讯,引领技术潮流,新鲜有温度,专业有态度的技术人社区。更多精彩内容,动动手指,长按二维码自动识别即可获取关注。您也可以搜索“geekbang01”手动获取。

关于“geekbang01”,我们还在成长,希望有更多有极客精神有专业有态度的技术人来共同浇灌,一起茁壮。


 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 毕业这两年 用Swift搭建数据驱动型iOS架构 Twitter开源了数据实时分析平台Heron 缓存更新的套路 深度链接——APP用户增长的引擎