Kotlin是一门与Swift相似的静态类型JVM语言,由JetBrains设计开发并开源。与Java相比,Kotlin的语法更简洁、更具表达性,并且提供了更多的特性,好比,高阶函数、操做符重载、字符串模板。它与Java高度可互操做,能够同时用在一个项目中。html
按照JetBrains的说法,根据他们多年的Java平台开发经验,他们认为Java编程语言有必定的局限性和问题,并且因为须要向后兼容,它们不可能或很可贵到解决。所以,他们建立了Kotlin项目,主要目标是:git
Ashraff Hathibelagal是一名喜欢研究新框架和SDK的独立开发者。近日,他撰文介绍了Kotlin的一些语法。按照他的说法,一个合格的Java程序员能够在很短的时间内学会使用Kotlin。程序员
类与构造函数github
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项目相关的库。