Kotlin:Android世界的Swift
转自:http://www.infoq.com/cn/news/2015/06/Android-JVM-JetBrains-Kotlin
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对可以为空的变量和不可以为空的变量作了区分。在上述代码中,变量name
和age
不可为空,而?
表明变量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)
}
while
和do..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项目的读者,可以读下这篇文章。
Kotlin:Android世界的Swift的更多相关文章
- 【转】Android世界的Swift - Kotlin语言
最近Oracle又在和Google撕的厉害,才知道还有这么Kotlin在Android像Swift在Mac的地位一说. Kotlin是一门与Swift类似的静态类型JVM语言,由JetBrains设计 ...
- Kotlin Android Studio 环境搭建
Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的Swift,由 JetBrains 设计开发并开源. Kotlin 可以编译成Java字节码,也可以编 ...
- Android平台的Swift—Kotlin
WeTest 导读 Kotlin 已经出来较长一段时间了,有些同学已经对Kotlin进行了深入的学习,甚至已经运用到了自己的项目当中,但是还有较多同学可能只是听过Kotlin或简单了解过,这篇文章的目 ...
- Kotlin, Android的Swift
Kotlin, Android的Swift 苹果已经用Swift代替Objective-C,一种古老的语言,来进行iOS的开发了.明显Android开发也有这个趋势. 虽然现在已经可以选择Scala或 ...
- Kotlin & Android & Swift & Flutter & React Native
Kotlin & Android https://www.runoob.com/kotlin/kotlin-tutorial.html Swift 5 & iOS 12 https:/ ...
- Android NFC开发(二)——Android世界里的NFC所具备的条件以及使用方法
Android NFC开发(二)--Android世界里的NFC所具备的条件以及使用方法 NFC的应用比较广泛,而且知识面也是比较广的,所以就多啰嗦了几句,我还还是得跟着官方文档:http://dev ...
- Kotlin Android学习入门
1.基本语法 https://github.com/mcxiaoke/kotlin-notes/blob/master/kotlin-tutorial-basic.md 2.推荐两篇Kotlin An ...
- Kotlin Android Extensions: 与 findViewById 说再见 (KAD 04) -- 更新版
作者:Antonio Leiva 时间:Aug 16, 2017 原文链接:https://antonioleiva.com/kotlin-android-extensions/ 在 Kotlin1. ...
- Kotlin Android Extensions (译文)
原文链接: http://kotlinlang.org/docs/tutorials/android-plugin.html Kotlin Android Extensions 本教程介绍如何使用Ko ...
随机推荐
- javascript学习总结(三):如何较好的使用js。
1 假如浏览器不支持JavaScript怎么办? a.为什么浏览器会不支持?大部分浏览器都有禁用脚本的功能,例如chrome.b.在js被禁用的情况下要保证网页仍能实现它的核心功能(关键的用户需求) ...
- Spring定时器,定时执行(quartz)
这个定时器与继承了timertask的定时器不同的是,这个定时器是更强大的,可以指定每分的第n秒,每天的第n时,每周的.每年的.来定时运行这个定时器.那么下面来讲诉如何使用quartz定时器. spr ...
- 在SQL Server 2014里可更新的列存储索引 (Updateable Column Store Indexes)
传统的关系数据库服务引擎往往并不是对超大量数据进行分析计算的最佳平台,为此,SQL Server中开发了分析服务引擎去对大笔数据进行分析计算.当然,对于数据的存放平台SQL Server数据库引擎而言 ...
- javascript时间戳和日期字符串相互转换
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...
- HTML5拓扑图形组件设计之道(一)
HT for Web(http://www.hightopo.com/guide/readme.html)提供了涵盖通用组件.2D拓扑图形组件以及3D引擎的一站式解决方案,正如Hightopo官网所表 ...
- Ionic2学习笔记(1):新建一个页面
作者:Grey 原文地址: http://www.cnblogs.com/greyzeng/p/5532323.html 新建一个页面: 借上一篇中的HelloWorl ...
- 30天C#基础巩固-----值类型/引用类型,泛型,空合并操作符(??),匿名方法
一:值类型/引用类型的区别 值类型主要包括简单类型,枚举类型,和结构体类型等,值类型的实例通常被分配在线程堆栈上面变量保存的内容是实例数据本身.引用类型被分配在托管堆上,变量保存的是地址.引 ...
- Mac下Vim配置语法高亮
设置终端的字体颜色 如图,打开终端然后,选择偏好设置,再选择描述文件,再窗口左侧可以选择系统配置好的,或者你也可以自定义,最后别忘了把你的配置设置成默认就行 Vim语法高亮设置 只需要找到vimrc配 ...
- Unicode中文和特殊字符的编码范围
编程中有时候需要用到匹配中文的正则,一般用 [ \u4e00-\u9fa5]+ 即可搞定.不过这正则对一般的火星文鸟语就不太适用了,甚至全角的标点符号都不包含在内.例如游戏里面的玩家名,普通青年一般都 ...
- Time series database
https://en.wikipedia.org/wiki/Time_series_database https://influxdb.com/docs/v0.9/introduction/getti ...