Kotlin

title: 历史.
content: 2011年7月,JetBrains推出Kotlin项目,这是一个面向JVM的新语言,它已被开发一年之久。JetBrains负责人Dmitry Jemerov说,大多数语言没有他们正在寻找的特性,但是Scala除外。但是,他指出Scala的编译时间过慢这一明显缺陷。Kotlin的既定目标之一是像Java一样快速编译。2012年2月,JetBrains以Apache 2许可证开源此项目。  Jetbrains希望这个新语言能够推动IntelliJ IDEA的销售。  Kotlin v1.0于2016年2月15日发布。这被认为是第一个官方稳定版本,并且JetBrains已准备从该版本开始的长期向后兼容性。  在Google I/O 2017中,Google宣布在Android上为Kotlin提供最佳支持。
title: 语法.
content: Kotlin很明显受到Java、C#、JavaScript、Scala、Groovy等语言的影响。例如Kotlin可以直接通过codice_1或codice_2来使用字串模板,和古老的shell script类似。又如Kotlin中的分号是可选的,这类似JavaScript,而且Groovy、Scala也有同样的能力。Kotlin常量定义关键字是codice_3(不同于变量定义关键字codice_4),表示固定值,这功能来自Scala,Swift也有类似功能。  需要注意,Kotlin没有关键字codice_5。
title: 常量与变量.
content: 使用codice_3(全称为value,即(固定的)值)关键字定义常量,定义后其值无法修改  使用codice_4(全称为variable,即变量)关键字定义变量。
title: 函数.
content: 使用codice_8关键字定义一个函数。  上例定义了一个传入两个Int变量,并返回两数之和的求和函数。
title: Main 进入点.
content: Kotlin的main函数是不依赖类别的,所以main函数是一个top-level函数。支持Perl和Unix/Linux shell script的字符串插值(String interpolation),同样也支持类型推定。  // Hello, world! 范例 fun main(args: Array<String>) {
title: 函数扩展.
content: Kotlin与C#、JavaScript类似,能够扩展类别的新功能,而无需继承该类别,或使用像装饰器(decorator)这样的任何类型的设计模式(design pattern)。扩展函数可以称为Kotlin的核心,在标准库里到处充斥着扩展函数。  扩展函数是静态分发的,也就是说,它们不是以接收者类型为准的虚拟函数。这意味着调用的扩展函数是由函数调用所在的表达式的类型来决定的,而不是由表达式运行时求值结果决定的。  在下述例子中,String类别被扩展出一个成员lastChar。  利用函数扩展,Kotlin也支持运算符重载:
title: getter和setter.
content: Kotlin像C#一样支持属性(property)。
title: 解包引数.
content: 类似Python, 解包(unpack)指的是对实际参数的解包,只需在前面加一个星号* 即可,如test(*a):
title: 函数嵌套.
content: Kotlin支持函数嵌套(nested functions),允许函数内再定义函数,类似JavaScript、C#与Python语言。
title: 解构声明.
content: Kotlin支持解构声明,这与Python的迭代解包相似。  例如, collection object 包含解构式可分离其元素:
title: 抽象类别.
content: 抽象类别(Abstract classes)定义抽象或纯虚拟(Pure Virtual)占位函数,需要被继承。抽象类别默认是open的。
title: 类别属性.
content: Kotlin 提供下列的关键字来限制顶层(top-level)声明,用于控制类别与成员在继承时的可见性(作用域)。它们可用于类别及其成员: 用于类别的成员声明时,含义如下:  用于顶层声明时,含义如下:  例如:
title: 主构造函数 vs. 二级构造函数.
content: 在Kotlin 中类别可以有一个主构造函数以及多个二级构造函数。如果主构造函数没有注解或可见性说明,则codice_9关键字可以省略。如果构造函数中没有其它操作,大括号也可以省略。  Kotlin 的二级构造函数更类似于 C++, C#, 和 Java。
title: Anko library.
content: Anko 是一组为Kotlin 打造的函数库,其功能是用来开发Android UI 应用程序,现已弃用。
title: Kotlin 交互模式.
content: Kotlin除了编译成Java字节码运行,也可以作为脚本语言解释运行,此特性使得Kotlin可以以交互模式运行。交互模式是脚本语言具有的特性,解释器可以立即运行用户输入的代码,并反馈运行结果。典型的语言有Python、JavaScript(在V8引擎支持下)、Ruby。 $ kotlinc-jvm type :help for help; :quit for quit »> 2+2 4 »> println("Welcome to the Kotlin Shell") Welcome to the Kotlin Shell
title: Kotlin 也是脚本语言.
content: Kotlin 亦可视为脚本语言(scripting language)。其脚本存成 Kotlin source file (.kts),即成为可执行档。 // list_folders.kts import java.io.File 为了执行Kotlin 脚本,我们在运行编译器时再加上选项。 $ kotlinc -script list_folders.kts "path_to_folder_to_inspect"
title: Kotlin 的 hello world 例子.
content: fun main(args: Array<String>) {  //inline higher-order functions inline fun greet(s: () -> String) : String = greeting andAnother s()  //infix functions, extensions, type inference, nullable types, lambda expressions, labeled this, elvis operator infix fun String.andAnother(other : Any?) = buildString() { append(this@andAnother); append(" "); append(other?: "") }  //immutable types, delegated properties, lazy initialization, string templates  //sealed classes, companion objects  //extensions, Unit fun String.print() = println(this)
title: 空变量及其运算.
content: Kotlin对可以为空(nullable)的变量和不可以为空(non-nullable)的变量作了区分。所有的可空对象(nullable objects)必须在定义时加上 "?" 后置于类型之后。开发人员遇到nullable objects时要先确认: null-check 须被执行过,才能赋值。可空性是Kotlin类型系统中帮助开发者避免以往Java的NullPointerException错误的特性。  Kotlin 提供空安全(null-safe)运算符给开发人员: fun sayHello(maybe: String?, neverNull: Int) {  使用安全导引(safe navigation)运算符:
title: 高阶函数与lambda.
content: Kotlin 亦支持高阶函数和lambdas功能。lambda是一种匿名函数,允许开发者直接将表达式定义为函数,这类似于Python。  Lambdas 可用大括号来定义。如果lambda 夹带参数,他们可定义在大括号内,并以运算符区隔。

Summary: Kotlin是一种在Java虚拟机上执行的静态型别程序语言,它也可以被编译成为JavaScript源代码。它主要是由俄罗斯圣彼得堡的JetBrains开发团队所发展出来的程序语言,其名称来自于圣彼得堡附近的科特林岛。2012年1月,著名期刊《Dr. Dobb's Journal》中Kotlin被认定为该月的最佳语言。虽然与Java语法并不相容,但在JVM环境中Kotlin被设计成可以和Java程序码相互运作,并可以重复使用如Java集合框架等的现有。Hathibelagal写道,“如果你正在为Android开发寻找一种替代编程语言,那么应该试下Kotlin。它很容易在Android项目中替代Java或者同Java一起使用。”