计算机科学

首页 > 计算机科学

Kotlin

2018-09-05 18:18:40     所属分类:程序设计语言
Kotlin
Kotlin 图标
设计者 JetBrains
实现者 JetBrains与开源贡献者
发行时间 2011
稳定版本
Kotlin 1.2.30
(2018年3月1日,​6个月前​(2018-03-01 [1]
预览版本
Kotlin 1.2 rc 1
(2017年11月12日,​9个月前​(2017-11-12 [2]
类型系统 静态类型、类型推论
系统平台 输出Java虚拟机比特码以及JavaScript源代码
操作系统 任何支持JVM或是JavaScript的解释器
许可证 Apache 2
文件扩展名 .kt
网站 kotlinlang.org
启发语言
Java、Scala、Groovy、C#、Gosu英语Gosu

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

目录

  • 1 历史
  • 2 语法
    • 2.1 常量与变量
    • 2.2 函数
    • 2.3 Main 进入点
    • 2.4 函数扩展
    • 2.5 getter和setter
    • 2.6 解包引数
    • 2.7 函数嵌套
    • 2.8 解构声明
    • 2.9 抽象类
    • 2.10 类别属性
    • 2.11 主构造函数 vs. 二级构造函数
    • 2.12 Anko library
    • 2.13 Kotlin 交互模式
    • 2.14 Kotlin 也是脚本语言
    • 2.15 Kotlin 的 hello world 例子
    • 2.16 空变量及其运算
    • 2.17 高阶函数与lambda
  • 3 参考资料
  • 4 外部链接

历史

2011年7月,JetBrains推出Kotlin项目,这是一个面向JVM的新语言,它已被开发一年之久。[5]JetBrains负责人Dmitry Jemerov说,大多数语言没有他们正在寻找的特性,但是Scala除外。但是,他指出Scala的编译时间过慢这一明显缺陷。[5]Kotlin的既定目标之一是像Java一样快速编译。2012年2月,JetBrains以Apache 2许可证开源此项目。[6]

Jetbrains希望这个新语言能够推动IntelliJ IDEA的销售。[7]

Kotlin v1.0于2016年2月15日发布。[8]这被认为是第一个官方稳定版本,并且JetBrains已准备从该版本开始的长期向后兼容性。

在Google I/O 2017中,Google宣布在Android上为Kotlin提供最佳支持。[9]

语法

Kotlin很明显受到Java、C#、JavaScript、Scala、Groovy等语言的影响。例如Kotlin可以直接通过println("Hello, {name}")println("Hello, $name")来使用字符串模板,和古老的shell script类似。又如Kotlin中的分号是可选的,这类似JavaScript,而且Groovy、Scala也有同样的能力。Kotlin常量定义关键字是val(不同于变量定义关键字<codr>var),表示固定值,这功能来自Scala,Swift也有类似功能。

注意,Kotlin没有关键字new

常量与变量

使用val(全称为value,即(固定的)值)关键字定义常量,定义后其值无法修改。使用var(全称为variable,即变量)关键字定义变量。[10]

val a: Int = 1 // 定义a为`Int`类型的变量,其值为1
val b = 2 // 自动检测b为`Int`类型

使用var关键字定义变量。

var x = 5 // 定义一个`Int`,值为5
x = 1 // 修改值为1

函数

使用fun关键字定义一个函数。

fun sum(a: Int, b: Int): Int {
    return a + b
}

上例定义了一个传入两个Int变量,并返回两数之和的求和函数。

Main 进入点

Kotlin的main函数是不依赖类别的,所以main函数是一个top-level函数。支持Perl和Unix/Linux shell script的字符串插值(String interpolation),同样也支持类型推定()。

1 // Hello, world! 範例
2 fun main(args: Array<String>) {
3   val scope = "world"
4   println("Hello, $scope!")
5 }

函数扩展

Kotlin与C#类似,能够扩展类别的新功能,而无需继承该类别,或使用像装饰者(decorator)这样的任何类型的设计模式(design pattern)。扩展函数可以称为Kotlin的核心,在标准库里到处充斥着扩展函数。扩展函数是静态分发的,也就是说,它们不是根据接收者类型的虚拟函数。这意味着调用的扩展函数是由函数调用所在的表达式的类型来决定的,而不是由表达式运行时求值结果决定的。例如:

1     package MyStringExtensions
2 
3     fun String.lastChar(): Char = get(length - 1)
4 
5     >>> println("Kotlin".lastChar())

String 类别被扩展出一个lastChar.

1     // overloading '+' operator using an extension method
2     operator fun Point.plus(other: Point): Point {
3         return Point(x + other.x, y + other.y)
4     }
5 
6     >>> val p1 = Point(10, 20)
7     >>> val p2 = Point(30, 40)
8     >>> println(p1 + p2)
9     Point(x=40, y=60)

getter和setter

Kotlin像C#一样支持属性(property)。

解包引数

类似Python, 解包(unpack)指的是对实际参数的解包,只需在前面加一个星号* 即可,如test(*a):

1     fun main(args: Array<String>) { 
2         val list = listOf("args: ", *args)
3         println(list)
4     }

函数嵌套

Kotlin支持函数嵌套(nested functions),允许函数内再定义函数,类似JavaScript、C#与Python语言。

 1     class User(
 2         val id:      Int, 
 3         val name:    String, 
 4         val address: String) 
 5     { 
 6 
 7         fun saveUser(user: User) {
 8            fun validate(user: User, value: String, fieldName: String) {
 9                if (value.isEmpty()) {
10                    throw IllegalArgumentException(
11                       "Can't save user ${user.id}: empty $fieldName")
12                }
13            }
14 
15            validate(user, user.name, "Name") 
16            validate(user, user.address, "Address")
17            // Save user to the database
18         }
19     }

解构声明

Kotlin支持解构声明,这与Python的迭代解包相似。

例如, collection object 包含析构式可分离其元素:

1     for ((index, element) in collection.withIndex()) { 
2          println("$index: $element")
3     }

抽象类

抽象类(Abstract classes)定义抽象或纯虚拟(Pure Virtual)占位函数,需要被继承。抽象类别默认是open的。

 1     // No need for the open keyword here, its already open by default
 2     abstract class Animated {
 3 
 4         // This virtual function is already open by default as well
 5         abstract fun animate()
 6   
 7         open fun stopAnimating() { }
 8 
 9         fun animateTwice() { }
10     }

类别属性

Kotlin 提供下列的关键字来限制top-level声明,可用于类别及其成员:

   public, internal, protected, and private.

When applied to a class member:

   public (default): Visible everywhere 
   internal:         Visible in a module 
   protected:        Visible in subclasses 
   private:          Visible in a class 

When applied to a top-level declaration

   public (default):  Visible everywhere
   internal:          Visible in a module
   private:           Visible in a file

例如:

1     // Class is visible only to current module
2     internal open class TalkativeButton : Focusable {
3         // method is only visible to current class 
4         private   fun yell() = println("Hey!") 
5 
6         // method is visible to current class and derived classes
7         protected fun whisper() = println("Let's talk!")
8     }

主构造函数 vs. 二级构造函数

在Kotlin 中类可以有一个主构造函数以及多个二级构造函数。如果主构造函数没有注解或可见性说明,则constructor关键字可以省略。如果构造函数中没有其它操作,大括号也可以省略。

1      // Example of class using primary constructor syntax
2      // (Only one constructor required for this class)
3      class User(
4          val nickname: String, 
5          val isSubscribed: Boolean = true) 
6      {
7          ...
8      }

Kotlin 的二级构造函数更类似于 C++, C#, 和 Java。

 1     // Example of class using secondary constructor syntax
 2     // (more than one constructor required for this class)
 3     class MyButton : View {
 4 
 5         // Constructor #1 
 6         constructor(ctx: Context) : super(ctx) { 
 7             // ... 
 8         } 
 9   
10         // Constructor #2
11         constructor(ctx: Context, attr: AttributeSet) : super(ctx, attr) { 
12             // ... 
13         }
14     }

Anko library

Anko 是一组为Kotlin 打造的函数库,其功能是用来开发Android UI 应用程序。[11]

1         fun Activity.showAreYouSureAlert(process: () -> Unit) {
2             alert(
3               title   = "Are you sure?",
4               message = "Are you really sure?") 
5             {
6               positiveButton("Yes") { process() }
7               negativeButton("No") { cancel() }
8             }
9         }

Kotlin 交互模式

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
>>>

Kotlin 也是脚本语言

Kotlin 亦可视为脚本语言(scripting language)。其脚本存成 Kotlin source file (.kts),即成为可执行档。

1 // list_folders.kts
2 import java.io.File
3 val folders = File(args0).listFiles { file -> file.isDirectory() }
4 folders?.forEach { folder -> println(folder) }

为了运行Kotlin 脚本,我们在运行编译器时再加上-script 选项。

1 $ kotlinc -script list_folders.kts "path_to_folder_to_inspect"

Kotlin 的 hello world 例子

 1 fun main(args: Array<String>) {
 2     
 3     greet {
 4         to.place
 5     }.print()
 6 }
 7 
 8 //inline higher-order functions
 9 inline fun greet(s: () -> String) : String = greeting andAnother s()  
10 
11 //infix functions, extensions, type inference, nullable types, lambda expressions, labeled this, elvis operator
12 infix fun String.andAnother(other : Any?) = buildString() { append(this@andAnother); append(" "); append(other ?: "") } 
13 
14 //immutable types, delegated properties, lazy initialization, string templates
15 val greeting by lazy { val doubleEl: String = "ll"; "he${doubleEl}o" }
16 
17 //sealed classes, companion objects
18 sealed class to { companion object { val place = "world"} }
19 
20 //extensions, Unit
21 fun String.print() = println(this)

空变量及其运算

Kotlin对可以为空(nullable)的变量和不可以为空(non-nullable)的变量作了区分。所有的可空对象(nullable objects)必须在定义时加上 "?" 后置于类型之后。开发人员遇到nullable objects时要先确认: null-check 须被运行过,才能赋值。可空性是Kotlin类型系统中帮助开发者避免以往Java的NullPointerException错误的特性。

Kotlin 提供空安全(null-safe)运算符给开发人员:

  • ?. (safe navigation operator) 可用于安全访问(safely access) 可能是空对象的函数或属性。如果 object 为空(null), the method 将不被调用,而且表达式必运算(evaluate)为空(null)。
  • ?: (null coalescing operator) 经常引用到艾维斯运算符(Elvis operator):
fun sayHello(maybe: String?, neverNull: Int) {
   // use of elvis operator
   val name: String = maybe ?: "stranger"
   println("Hello $name")
}

使用安全导引(safe navigation)运算符:

  // returns null if...
  // - foo() returns null,
  // - or if foo() is non-null, but bar() returns null,
  // - or if foo() and bar() are non-null, but baz() returns null.
  // vice versa, return value is non-null if and only if foo(), bar() and baz() are non-null
  foo()?.bar()?.baz()

高阶函数与lambda

Kotlin 亦支持高阶函数和lambdas功能。lambda是一种匿名函数,允许开发者直接将表达式定义为函数,这类似于Python。[12]

  // the following function takes a lambda, f, and executes f passing it the string, "lambda"
  // note that (s: String) -> Unit indicates a lambda with a String parameter and Unit return type
  fun executeLambda(f: (s: String) -> Unit) {
    f("lambda")
  }

Lambdas 可用大括弧{ } 来定义。如果lambda 夹带参数,他们可定义在大括弧内,并以->运算符区隔。

  // the following statement defines a lambda that takes a single parameter and passes it to the println function
  val l = { c : Any? -> println(c) }
  // lambdas with no parameters may simply be defined using { }
  val l2 = { print("no parameters") }

参考资料

  1. ^ https://github.com/JetBrains/kotlin/tree/v1.2.30
  2. ^ https://github.com/JetBrains/kotlin/tree/v1.2-rc1
  3. ^ Heiss, Janice. The Advent of Kotlin: A Conversation with JetBrains' Andrey Breslav. oracle.com. Oracle Technology Network. April 2013 [February 2, 2014]. 
  4. ^ Breslav, Andrey. Language of the Month: Kotlin. drdobbs.com. January 20, 2012 [February 2, 2014]. 
  5. ^ 5.0 5.1 Krill, Paul. JetBrains readies JVM language Kotlin. infoworld.com. InfoWorld. Jul 22, 2011 [February 2, 2014]. 
  6. ^ Waters, John. Kotlin Goes Open Source. ADTmag.com/. 1105 Enterprise Computing Group. February 22, 2012 [February 2, 2014]. 
  7. ^ Why JetBrains needs Kotlin. we expect Kotlin to drive the sales of IntelliJ IDEA 
  8. ^ Kotlin 1.0 Released: Pragmatic Language for JVM and Android | Kotlin Blog. Blog.jetbrains.com. 2016-02-15 [2017-04-11]. 
  9. ^ Shafirov, Maxim. Kotlin on Android. Now official. May 17, 2017. Today, at the Google I/O keynote, the Android team announced first-class support for Kotlin. 
  10. ^ Basic Syntax. Kotlin. Jetbrains. [19 January 2018]. 
  11. ^ Anko Github
  12. ^ Higher-Order Functions and Lambdas. Kotlin. Jetbrains. [19 January 2018]. 

外部链接

  • 官方网站
  • 官方示例
  • 官方网站 - 中文翻译

版权声明:本文由北城百科网创作,转载请联系管理获取授权,未经容许转载必究。https://www.beichengjiu.com/computerscience/340560.html

显示全文

取消

感谢您的支持,我会继续努力的!

扫码支持
支付宝扫一扫赏金或者微信支付5毛钱,阅读全文

打开微信扫一扫,即可进行阅读全文哦


上一篇:架构描述语言
下一篇:MATLAB
相关推荐
爱淘宝