快捷搜索:  test  as

Kotlin实战01 — Kotlin是什么和为什么

Kotlin到底是什么呢?它是一个目标为Java平台上的新的编程说话。它是简洁、安然、实用和可以跟Java互操作。它能用到所有Java可以用到的地方: 办事端开拓,Android利用开拓,或者更多。Kotlin可以和所有存在的Java库和框架一路优越事情,有Java一样的效率。

1 体验Kotlin

用一个小例子来Kotlin来看是什么样子的。这个例子定义了一个Person类、创建人的聚拢,找到年岁最大年夜的那个,然后打印结果。

定义"data"类Person,有两个属性name和age,age属性可空类型Int?,默觉得null

data class Person(val name: String, val age: Int? = null)

顶层函数main里面,定义了人的列表,轻忽了Alice的age属性,以是设置为默认属性为null值。然后用maxBy函数找到年岁最大年夜的那小我。lambda表达式通报给函数,lambda吸收一个默认名字为it的一个参数。假如age属性为null,埃尔维斯操作子(Elvis operator ?:)返回零。由于Alice的age没有指定,以是埃尔维斯操作子调换age为零。以是Bob赢得了这个奖:年岁最大年夜的人。

fun main(args: Array) {

val persons = listOf(Person("Alice"), Person("Bob", age = 29))

val oldest = persons.maxBy { it.age ?: 0 }

println("The oldest is: $oldest")

}

// The oldest is: Person(name=Bob, age=29)

2 Kotlin的主要特点

2.1 目标平台: 办事器端、Android、Java运行的任何地方

Kotlin 可以用在Java运行的任何地方,从智能卡到谷歌、推特、领英和其他的互联网级其余公司的数据中间。Kotlin最广泛的利用领域为:

构建办事端代码(范例的为,收集利用的后端)

构建运行在Android设备里面的移动利用

别的在其他情况中的利用

比如,在IOS设备中,经由过程因特尔的多系统引擎https://software.intel.com/en-us/multi-os-engine,可以运行Kotlin代码;

再比如,可以和TornadoFXhttps://github.com/edvin/tornadofx和JavaFX一路构建桌面利用

在Java外,Kotlin可以编译成JavaScript,然则现在JetBrains还在探索和原型中。在今后的版本中会支持更多的平台。

2.2 静态的类型

和Java一样,Kotlin也是静态编程说话。这意味着,每个类型的表达式在编译阶段就确定了。这个与动态编程说话相反,比如在JVM运行的Groovy和JRuby,可以定义变量和函数可以存储或者返回任何类型的数据,在运行的时刻解析。

和Java不一样的是,Kotlin可以在高低文中自动抉择一个变量的类型,这容许轻忽声明时刻的类型,这叫类型推导。如下,自动推导为Int类型。

val x = 1

以下是静态类型的上风

机能--- 措施调用更快,由于不要在运行时确定哪个措施必要调用。

靠得住--- 编译器会验证每个法度榜样的精确性,以是在运行的时刻更少的崩溃。

可掩护--- 处置惩罚不认识代码更轻易,由于你可以看到你处置惩罚的代码的什么目标。

对象支持--- 靠得住的重构,正确的代码补全和其他的IDE特点

因为类型推导,静态类型的繁琐消掉了,由于不要显示的声明类型。Kotlin类型系统和Java里面的观点很相像,比如类,接口,泛型。然则Kotlin有些新器械。最紧张的是可空类型(nullable type),让你写更靠得住的法度榜样,可以在编译的时刻发明NPE;还有便是Kotlin支持函数类型(function types)

2.3 函数式和面向工具式

Java开拓者认识面向工具的编程,不认识函数式编程,它的关键观点如下:

一等函数--- 把函数(一些行径)当成值,可以存储子变量中,可以当成参数通报,在其他的函数返回。

弗成变性--- 工具在创建后不能改变它的状态

无副感化--- 给定同个输入,纯函数返回相同的结果,不会改变别的的工具的状态,也外部天下交互。

函数式编程有什么好处呢?第一,简洁,相对付敕令式,函数式代码更优雅和简明,由于把函数当成值给你抽象的气力。假设,你有两个相似的代码片段实现相似的义务。你可以抽取相同的逻辑到一个函数,把不合的部分作为函数的参数。这些参数本身便是函数,你可以用lambda表达式作为匿名函数。

fun findAlice() = findPerson { it.name == "Alice" }

fun findBob() = findPerson { it.name == "Bob" }

第二,多线程安然,多线程法度榜样最多的差错,在于没有精确的同步下,改变了多线程下同一个数据。假如你用弗成变的数据布局和纯函数,不安然的变动就不会发生。

着末,轻易测试,没有副感化的函数可以自力的测试,不要太多的设置依附的全部情况

一样平常地讲,函数式类型可以在包孕Java的所有编程说话中应用。然则不是所有的说话供给句法和库支持来轻松应用。比如,Java8之前版本就不支持。Kotlin一开始就有富厚的功能集来支持函数式编程。这包括:

函数类型--- 让函数吸收其他的函数作为参数或者返回其他的函数

Lambda表达式--- 让你用起码的样板代码来通报一段代码

数据类型--- 供给简洁的语法来创建不变的值实例

标准库中富厚的API集,以函数式类型,处置惩罚实例和聚拢

2.4 免费和开源代码

Kotlin说话,包括编译器、库和相关的对象,是完全开源的和任何目的的免费应用,可以Apache2许可下取得。在Github上公开开拓http://github.com/ jetbrains/ kotlin,迎接社区供献代码。有三种开源IDE开拓Kotlin代码: IntelliJ社区版本, Android Studio, 和Eclipse。

3 kotlin利用

3.1办事器真个Kotlin

办事器端编程是相称宽的观点,它不止包括如下:

收集利用,返回HTML页面到浏览器

移动利用的后端,经由过程HTTP裸露JSON的API

微办事,经由过程RPC协讲和其他的微办事通讯

Java能积累了一大年夜堆框架和技巧。Kotlin最大年夜的上风是,能和Java存在的Java代码互操作。不管是写一个新部件照样移植已经存在的办事,Kotlin异常得当。扩展新的Java类,照样注释类的措施或者域,你不会碰见任何问题。上风是,系统的代码加倍紧凑,加倍靠得住和更轻易掩护。

同时,Kotlin成长了一些开拓这些系统的新技巧。比如,它支持Builder模式,让你用简洁的语法构建一个实例图谱,同时维持抽象和代码重用。一个最简单用例是HTML天生库,它用简洁和类型安然的办理规划,代替了一个外部模板说话,下面便是个例子:

fun renderPersonList(persons: Collection

) =

createHTML().table {//HTML标签

for (person in persons) {//一样平常情形的回圈

tr {//HTML标签

td { +person.name } //HTML标签

td { +person.age }

}

}

}

}

别的的例子是,你用Kotlin简洁和整齐的DSL的持久化框架。比如Exposed框架https://github.com/jetbrains/exposed,供给了轻易读的DSL,完全用Kotlin代码和静态反省,来描述SQL数据库布局和增删查改。这是一个小例子:

object CountryTable : IdTable() { //描述一个数据库表

val name = varchar("name", 250).uniqueIndex()

val iso = varchar("iso", 2).uniqueIndex()

}

class Country(id: EntityID) : Entity(id) { //创建一个响应数据库entity的类

var name: String by CountryTable.name

var iso: String by CountryTable.iso

}

val russia = Country.find {//用纯挚的Kotlin代码查询这个数据库

CountryTable.iso.eq("ru")

}.first()

println(russia.name)

3.2 Android上的Kotlin

Kotlin说话特点,和在Android框架上的一个特其余插件编译器,把Android开拓变成一个加倍有效率和开心的经历。一样平常的开拓义务,比如为控件添加监听器,或者绑结构元素到域,可以用加倍少的代码,或者根本不用代码(编译器为你临盆)。Anko库https://github.com/kotlin/anko,也是由Kotlin团队构建,用来改良开拓经历:在许多Android标准API上添加Kotlin友好的适配器。

以下是Anko的一个简单例子,把这段代码放在Activity中,一个简单的Android利用就好了:

verticalLayout {

val name = editText() 一个简单的文本域

button("Say Hello") { //当点击时,按钮显示文本域的值

onClick { toast("Hello, ${name.text}!") }//一个简洁的API,添加一个监听器和显示一个toast

}

}

别的一个应用Kotlin的上风是更好的利用靠得住性。假如你认识Android利用开拓,你必然不会陌生Unfortunately, Process Has Stopped dialog,这个便是利用抛出了一个未经处置惩罚的非常--平日是NullPointerException。Kotlin类型系统,加倍正确的追踪null值,使得NPE更少发生。

同时,Kotlin完全兼容Java6,不会带来兼容问题。至于机能,应用Kotlin不会带来任何劣势。Kotlin编译器天生的代码和一样平常的Java代码一样有效率。Kotlin的运行时的代码相称小,以是你不会见到一个编译的利用包大年夜小的增大年夜。kotlin标准库函数将会内联lambda,内联的lambda是的没有新的实例创建,利用也不会遭受到额外的GC停滞。

4 Kotlin的哲学

当我们讲到Kotlin,我们乐意说是实用、简洁和安然的说话,同时强调互操作性。

4.1 实用

实用意味着Kotlin是一个设计成办理现实天下问题的实用说话。这个设计因此多年来构建大年夜规模系统的工业履历为根基的;它的功能是为办理浩繁软件开拓者碰见的问题而遴选的。再者,Jetbrains团队和社区多年应用Kotlin早期的各类版本,他们的反馈塑造了这个说话的早期版本。

Kotlin不是一个钻研说话,我们不会考试测验编程说话设计的艺术和探索谋略机科学的立异思惟。相反,只有有可能,我们依附一些已经在其他说话证实对照成功的功能和办理规划,这削减了说话的繁杂性,也使得依附认识的观点来更轻易的进修。

此外,Kotlin不会强制用任何特其余编程风格和范式。一开始进修这个说话,你可以用认识的Java的风格和技术。然后你徐徐会发明Kotlin加倍强大年夜的特点,然后进修在代码中利用他们,使得代码加倍简洁和相符说话习气。

Kotlin的实用性的别的一个方面是,关注对象。开拓者效率来说,一个智能的开拓情况与一个好的说话一致紧张。以是,不会把IDE支持作为事后的设法主见。Kotlin来说,IntelliJ IDEA插件和编译器的开拓步调同等。

4.2 简洁

众所周知,读代码比写代码花的光阴更多。以是代码越简单和简洁,你理解的越快。假如说话的语法清晰的表达了代码的意图,而且指定这个意图这么完成的样板代码不会掩饰笼罩它,这就说,说话是简洁的。

Kotlin中,相称多的标准Java样板代码,比如getter、setter和构造子的参数赋值到域,在Kotlin是暗藏的,不会使你的源代码杂乱。别的一个合理的代码是,不必要写显式的代码来履行一些通用的义务,比如,在一个聚拢中定位一个元素。Kotlin有富厚的标准库函数来替代冗长重复的库函数调用代码。Kotlin支持lambda表达式,这使得通报一小段代码给库函数加倍轻易。

同时,Kotlin不会把源代码压缩成起码字符。比如,只管Kotlin支持操作子重载,然则用户不能定义自己的操作子。以是,库的开拓者不能用含义隐隐的标点符号替代措施名。

4.3 安然

一样平常,说一个编程说话是安然的,意味着设计阻拦了一些类型的差错。当然,这没有绝对性。阻拦差错老是要价值的。以是,在你得到的安然性等级和效率丧掉之间,总有权衡。

在Kotlin中,我们考试测验一个比Java高的安然等级,然则用异常小的收拾价值。kotlin不用指明所有的类型声明,然则编译器可以自动推导出它的类型。此外,在编译阶段反省来阻拦更多的差错,而不是在运行阶段掉败。Kotlin类型系统追踪值能或者不能为空,从而禁止导致运行时的NPE。一个额外的代码是很小的,只要在可空的类型着末标记一个问号

val s: String? = null //May be null

val s2: String = ""//May not be null

此外,Kotlin供给一些处置惩罚可空数据的便利措施。Kotlin避免的别的一种非常是ClassCastException。Java的开拓者一样平常不会反省类型,由于类型名字必须在反省和接下来的强转中。在Kotlin中,反省和强转合并到一个操作:

if (value is String)//Checks the type

println(value.toUpperCase()) //Uses the method of the type

4.4 互操作性

“我能用已经存在的库吗?”,Kotlin说,“当然可以”。不管库必要你用什么样的API,你可以在Kotlin中应用。你可以调用Java的措施,扩展Java的类,和实现接口,利用Java评释到Kotlin类中,等等。

不像其他的JVM说话,Kotlin在互操作性进了一步,在Java中可以调用Kotlin代码。也没什么技术:Kotlin类和措施就像正常的Java类和措施一样可以调动。这使得在你项目中机动应用混杂的Kotlin和Java。

Kotlin关注的互操作性的别的一个领域是,最大年夜程度的应用已经存在的Java库。比如,Kotlin没有自己的聚拢库,它完全依附Java标准库的类,而且为了便利,用额外的函数来扩展。当你Kotlin中调用Java API,你不必要包装或者变换实例,反之亦然。

Kotlin对象也供给了跨说话项目的完备支持。可以编译随意率性Java和Kotlin源文件。IDE功能不合说话也适用:

Java和Kotlin源文件的自由导航

混杂说话项目的调试,不合说话的代码一步步跟踪

Java措施的重构,Kotlin代码的精确更新,或者相反

5 应用kotlin对象

评论争论下,编译历程是怎么事情的,为你供给了什么对象。关于怎么设置情况,请参考Kotlin网页的“教程” https://kotlinlang.org/docs/tutorials

5.1 编译Kotlin代码

Kotlin源码一样平常存储在扩展名为.kt的文件中。编译器阐发源码,天生。class文件,就像Java编译器一样。天生的.class然后用你利用类型的标准历程打包履行。最简单的情形,在敕令行顶用kotlinc敕令编译代码,用Java敕令履行代码。

kotlinc-include-runtime -d

java -jar

简单描述Kotlin的构建历程如下:

Kotlin build process

Kotlin编译器编译的代码依附Kotlin运行时库。这个库包孕了定义kotlin自己的标准库类和扩展,这些类和扩展是加入到标准Java API中。运行时库必要和你的利用一路宣布。

在实际事例中,你会应用构建系统,比如,Maven,Gradle或者Ant来编译代码。Kotlin兼容这些构建系统。所有的构建系统都支持混杂说话项目,在同一个代码库中同同时编译Kotlin和Java。此外,Maven和Gradle把Kotlin运行时库作为利用的一个依附。

5.2 IntelliJ IDEA 和 Android Studio的插件

IntelliJ IDEA的kotlin插件和说话一路开拓的。这个IDE供给了开拓Kotlin的网站对象集。Kotlin插件包孕在IntelliJ IDEA 15或者更新的版本,不必要额外的设置。你可以用IntelliJ IDEA社区版本或者IntelliJ IDEA Ultimate。假如你应用Android Studio,你可以从插件治理器中安装插件。

5.3 交互式shell

假如你想考试测验一小段Kotlin代码,你可以用交互式shell(或者叫REPL),在REPL,你可以逐行敲Kotlin代码,可以急速望见履行结果。你可以运行不带参数的kotlinc敕令,或者用IntelliJ IDEA插件的相应目录上的选项。

5.4 Eclipse插件

Eclipse的kotlin插件供给了IDE基础功能,比如导航和代码补全。这个插件可以在Eclipse市场上得到。用目录上的赞助>Eclipse市场,搜索Kotlin。

5.5 在线playground

最简单的应用Kotlin措施不必要安装和设置设置设备摆设摆设。在http://try.kotl.in,你可以找到在线playground,你可以编写、编译和运行小段Kotlin法度榜样。playground有代码例子来演示Kotlin功能,也包括本书的例子和一系列交互进修的演习。

5.6 Java-to-Kotlin转换器

快速进修一门新说话是不会不辛勤气的。幸运的是,我们构建了一个友好的小小的快捷要领,让你依附已有的Java常识来加快进修。这个对象便是Java-to-Kotlin自动转换器。

当你进修Kotlin,转换器可以赞助你表达一些工作,纵然你不知道确切的语法。你可以用Java写相应的片段,然后拷贝到Kotlin文件中,这个转换器可以自动的转换到Kotlin。虽然结果不是最相符说话习气的,然则代码能事情。

您可能还会对下面的文章感兴趣: