最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

Kotlin:Android 世界的 Swift

  • 2015-06-25
  • 本文字数:2870 字

    阅读完需:约 9 分钟

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 = 24
jake.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 = 20
val isEligibleToVote = if(age > 18) "Yes" else "No"

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

复制代码
val age = 17
val 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 = 10
val b = 20
println("The sum is ${a+b}") // 打印 "The sum is 30"

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

上面介绍的只是 Kotlin 的一些基本语法和特性,更多细节请查阅官方文档。事实上,到目前为止,Kotlin 还仍然只是一个预览版本,接下来的几个月中还会有多项重大改进及新增特性。尽管如此, GitHub 上已有 400 多个与 Kotlin 项目相关的库

在另外一篇文章中,Hathibelagal 写道,“如果你正在为Android 开发寻找一种替代编程语言,那么应该试下Kotlin。它很容易在Android 项目中替代Java 或者同Java 一起使用。”想要了解如何在Android Studio 中使用Kotlin 开发Android 项目的读者,可以读下这篇文章。


感谢徐川对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015-06-25 06:3092384
用户头像

发布了 1008 篇内容, 共 374.1 次阅读, 收获喜欢 340 次。

关注

评论

发布
暂无评论
发现更多内容

Java项目实战营总结

eoeoeo

JAVA 九种排序算法详解(下)

加百利

Java 数组 排序 7月日更

爱了!阿里巴巴 Java 面试参考权威指南(泰山版)5月版开源

Java 编程 程序员 架构 面试

mPaaS 月度小报 | CodeDay#6 成都站落幕,下一站北京;上新季:新容器、新官网、新视觉

蚂蚁集团移动开发平台 mPaaS

移动开发 mPaaS

区块链时代下,企业如何打造数据要素的“新竞争力”?

旺链科技

大数据 产业区块链

手机如果能折叠能卷的话,电脑为什么不能呢?

船医特拉法尔加

开发者 工具 柔性屏

部分简单网页的基础了解

Emotion

html html5 Html报文解析 内部样式、 CSS语法

记某百亿级mongodb集群数据过期性能优化实践

杨亚洲(专注MongoDB及高性能中间件)

Java MySQL 数据库 mongodb 分布式数据库mongodb

渗透工程师必看-网络安全法条例-国家安全法介绍和案例

学神来啦

运维 黑客 安全 渗透

阿里的架构师一致好评!IT界首版全栈架构师全栈“成长笔记”开源!

Java架构追梦

Java 阿里巴巴 架构 面试 成长笔记

对EF Core进行扩展使支持批量操作/复杂查询

Spook

EF Core

linux网络编程—7层网络以及5种Linux IO模型以及相应IO基础

Linux服务器开发

后端 网络编程 Linux服务器开发 网络模型 IO模型

Hive学习笔记(一)

五分钟学大数据

hive 7月日更

监测生命体征、活动水平的可穿戴电子产品设计方案

不脱发的程序猿

物联网 ADI 可穿戴电子产品设计方案 监测生命体征、活动水平 智能传感器

这套获50w+星标的算法神仙文档,足你解决90%的对手,牛逼

编程 程序员 架构 面试

QuFi挖矿APP开发|QuFi挖矿系统软件开发

云原生打包工具:Buildpacks

QiLab

Docker 云原生 k8s buildpacks

银行4.0时代的营销与风控之路

索信达控股

大数据 金融科技 数字化转型 银行数字化转型 营销数字化

卧薪尝胆30天!啃透京东大牛的高并发设计进阶手册,终获P7意向书

Java 编程 程序员 架构 面试

字节跳动有状态应用云原生实践

火山引擎开发者社区

云原生 后端

数据归档 - 冷热数据处理大师

趣链科技

数据处理 区块链+

程序员如何提高开发效率?

万事ONES

项目管理 程序员 敏捷开发 ONES

云端赛车-Amazon DeepRacer 的前世今生

亚马逊云科技 (Amazon Web Services)

人工智能 开源

腾讯上线零点巡航,用Java手撕一个人脸识别系统

北游学Java

Java 腾讯 人脸识别

CDH 安装搭建(二)

大数据技术指南

CDH 7月日更

云图说|应用魔方AppCube:揭秘码农防脱神器

华为云开发者联盟

低代码 华为云 AppCube 云图说 应用魔方

Go 学习笔记之 字符串数据类型

架构精进之路

Go 语言 7月日更

共36万字!为上岸Alibaba,我把Github上Java面试题都整理了一遍

Java 编程 程序员 架构 面试

手把手教你实现聚光灯效果

ThingJS数字孪生引擎

大前端 可视化 智能灯控 数字孪生

MySQL连接数管理

Simon

MySQL

开源即巅峰!阿里首次分享:Java架构师全栈“成长笔记”

Java架构师迁哥

Kotlin:Android世界的Swift_JVM_谢丽_InfoQ精选文章