Kotlin是一种通用,免费,开放源代码,静态类型的“实用”编程语言,最初是为JVM(Java虚拟机)和Android设计的,结合了面向对象和功能性编程功能。 它专注于互操作性,安全性,清晰度和工具支持。 针对许多处理器的针对JavaScript ES5.1和本机代码(使用LLVM)的Kotlin版本也在生产中。
Kotlin于2010年起源于IntelliJ IDEA背后的公司JetBrains,并于2012年开始开源。Kotlin团队目前拥有来自JetBrains的90多名全职成员,而GitHub上的Kotlin项目拥有300多个贡献者。 JetBrains在其许多产品中都使用Kotlin,包括其旗舰产品IntelliJ IDEA。
[ 同样在InfoWorld上:您正在编写出色代码的11个标志 ]
Kotlin作为更简洁的Java语言
乍一看,Kotlin看起来更像Java的简化版本。 考虑上面的屏幕截图,其中我已将Java代码示例 (左)自动转换为Kotlin。 注意,实例化Java变量固有的无意识重复已经消失了。 Java习惯用法
StringBuilder sb = new StringBuilder();
成为Kotlin
val sb = StringBuilder()
您可以看到函数是使用fun
关键字定义的,并且当出现换行符时,分号现在是可选的。 val
关键字声明一个只读属性或局部变量。 同样, var
关键字声明一个可变属性或局部变量。
尽管如此,Kotlin是强类型的。 val
和var
关键字仅在可以推断类型时才可以使用。 否则,您需要声明类型。 每次发布Kotlin时,类型推断似乎都在改善。
查看两个窗格顶部附近的函数声明。 Java中的return类型在原型之前,但在Kotlin中,它在原型之后,并在Pascal中用冒号分隔。
从这个例子中并不完全明显,但是Kotlin放松了Java对函数必须是类成员的要求。 在Kotlin中,函数可以在文件的顶层声明,可以在其他函数内部局部声明,作为类或对象内部的成员函数以及扩展函数声明。 扩展功能提供了类似于C#的功能,可以使用新功能扩展类,而不必从类继承或使用任何类型的设计模式(例如Decorator)。
对于Groovy粉丝,Kotlin实施了构建器; 实际上,可以对Kotlin构建器进行类型检查。 Kotlin支持委托的属性,该属性可用于实现惰性属性,可观察的属性,可否决的属性和映射的属性。
可以使用Kotlin协程将其他语言中可用的许多异步机制实现为库。 这包括来自C#和ECMAScript的async
/ await
,来自Go的通道和选择,以及来自C#和Python的generators
/ yield
。
Kotlin中的函数式编程
允许顶级功能只是Kotlin功能编程故事的开始。 该语言还支持高阶函数,匿名函数,lambda,内联函数,闭包,尾递归和泛型 。 换句话说,Kotlin具有功能语言的所有功能和优势。 例如,考虑以下实用的Kotlin习惯用法 。
在Kotlin中过滤列表
val positives = list.filter { x -> x > 0 }
对于更短的表达式,请在lambda函数中只有一个参数时使用it
:
val positives = list.filter { it > 0 }
遍历Kotlin的地图/成对清单
for ((k, v) in map) { println(“$k -> $v”) }
k
和v
可以称为任何东西。
在Kotlin中使用范围
for (i in 1..100) { ... } // closed range: includes 100
for (i in 1 until 100) { ... } // half-open range: does not include 100
for (x in 2..10 step 2) { ... }
for (x in 10 downTo 1) { ... }
if (x in 1..10) { ... }
上面的示例显示了for
关键字以及范围的用法。
即使Kotlin是一种功能完善的功能编程语言,它仍保留了Java的大多数面向对象特性作为替代编程风格,这在转换现有Java代码时非常方便。 Kotlin具有类与构造函数,嵌套的,内部和匿名内部类放在一起,它有接口 ,如Java 8Kotlin没有一个new
关键字。 要创建类实例,请像常规函数一样调用构造函数。 我们在上面的屏幕截图中看到了这一点。
Kotlin有来自一个名为超单继承,并且所有Kotlin类有一个默认的超类Any
,这是不一样的的Java基础类java.lang.Object
。 Any
仅包含三个预定义的成员函数: equals()
, hashCode()
和toString()
。
Kotlin类必须用open
关键字标记,以允许其他类从它们继承。 Java类则相反,因为它们是可继承的, 除非用final
关键字标记。 要覆盖超类方法,必须将方法本身标记为open
,并将子类方法标记为override
。 这与Kotlin的使事情变得明确而不是依赖默认值的哲学完全相同。 在这种特殊情况下,我可以看到Kotlin显式地将基类成员标记为对继承开放并且将派生类成员标记为重写的方式避免了几种常见的Java错误。
[ 同样在InfoWorld上:TypeScript与JavaScript:了解差异 ]
Kotlin的安全设施
谈到避免常见错误,Kotlin旨在消除空指针引用的危险并简化对空值的处理。 它通过将标准类型的null
非法,添加可为null的类型并实现快捷方式符号来处理null测试来实现此目的。
例如, String
类型的常规变量 String
不能为null
:
var a: String = "abc"
a = null // compilation error
如果您需要允许空值(例如保存SQL查询结果),则可以通过在类型之后附加问号来声明可空类型,例如String?
。
var b: String? ="abc"
b = null // ok
保护措施走得更远。 您可以使用不受惩罚的不可为null的类型,但是在使用它之前,必须先测试可为null的类型是否具有null值。
为了避免null测试通常需要的冗长语法,Kotlin引入了一个安全的调用 ,写成“ ?.
。 例如, b?.length
b?.length
如果b
不为null
,则返回b.length
,否则返回null
。 此表达式的类型是Int?
。
换句话说, b?.length
是if (b != null) b.length else null
的快捷方式。 此语法很好地链接在一起,消除了很多prolix逻辑,尤其是当从一系列数据库查询中填充对象时,其中任何一个都可能失败。 例如,如果Bob,部门和部门负责人都不为空,则bob?.department?.head?.name
将返回Bob部门负责人的姓名。
要仅对非空值执行特定操作,可以使用安全调用运算符?.
与let
一起:
val listWithNulls: List<String?> = listOf("A", null)
for (item in listWithNulls) {
item?.let { println(it) } // prints A and ignores null }
通常,您通常想从可为空的表达式中返回有效但特殊的值,以便可以将其保存为不可为空的类型。 有一种特殊的语法叫做Elvis运算符(我不告诉你),写成?:
。
val l = b?.length ?: -1
等于
val l: Int = if (b != null) b.length else -1
同样,Kotlin省略了Java的检查异常,这些异常是必须捕获的可抛出条件。 例如,JDK签名
Appendable append(CharSequence csq) throws IOException;
要求您在每次调用append
方法时都捕获IOException
:
try {
log.append(message)
}
catch (IOException e) {
// Do something with the exception
}
Java的设计师认为,这是一个好主意,对于玩具程序来说,这是一个净赢,只要程序员在catch
子句中实现了明智的选择即可。 但是,在大型Java程序中,这种情况常常会出现,在代码中,强制性catch
子句只包含注释: //todo: handle this
。 这对任何人都无济于事,对于大型程序而言,检查异常是净损失。
Kotlin协程
Kotlin中的协程本质上是轻量级线程。 您可以在CoroutineScope
的上下文中使用launch
协CoroutineScope
器启动它们。 最有用的协程作用域之一是runBlocking{}
,它适用于其代码块的作用域。
import kotlinx.coroutines.*
fun main() = runBlocking { // this: CoroutineScope
launch { // launch a new coroutine in the scope of runBlocking
delay(1000L) // non-blocking delay for 1 second
println("World!")
}
println("Hello,")
}
该代码产生以下输出,每行之间有一秒的延迟:
你好,
世界!
Android版Kotlin
直到2017年5月,唯一受官方支持的Android编程语言是Java和C ++。 Google在Google I / O 2017 上宣布了对Android上Kotlin的正式支持 ,并且从Android Studio 3.0开始, Android开发工具集中内置了Kotlin 。 可以使用插件将Kotlin添加到早期版本的Android Studio中。
Kotlin编译为与Java相同的字节码,以自然方式与Java类互操作,并与Java共享其工具。 由于Kotlin和Java之间没有来回调用的开销,因此将Kotlin增量地添加到当前使用Java的Android应用中是很有意义的。 很少遇到Kotlin和Java代码之间缺乏互操作性的情况,例如Java set-set属性,这种情况很少遇到并且很容易解决。
早在2016年11月, Pinterest就是用Kotlin编写的Android应用程序的典型代表,而在Kotlin公告中, Pinterest在Google I / O 2017上被提及。 此外,Kotlin团队喜欢引用适用于Android的Evernote,Trello,Square和Coursera应用程序。
[ 也在InfoWorld上:如何将测试自动化与敏捷和devop结合使用 ]
Kotlin与Java
自Google I / O宣布以来,Android社区中已经出现了很多问题,即选择Kotlin还是Java进行新开发,尽管人们已经在2016年2月发布Kotlin 1.0时问过这个问题。 简短的答案是Kotlin代码比Java代码更安全,更简洁,并且Kotlin和Java文件可以共存于Android应用程序中,因此Kotlin不仅对新应用程序有用,而且对扩展现有Java应用程序也很有用。
我看到选择Kotlin而不是选择Java的唯一令人信服的论点是针对完整的Android开发新手。 对于他们来说,考虑到历史上大多数Android文档和示例都使用Java的情况,可能有一个超越的障碍。 另一方面,在Android Studio中将Java转换为Kotlin是将Java代码粘贴到Kotlin文件中的简单问题。
对于几乎所有其他进行Android开发的人来说,Kotlin的优势都是引人注目的。 Java开发人员学习Kotlin的典型时间是几个小时,这是消除空引用错误,启用扩展功能,支持函数编程以及添加协程的小笔费用。 典型的粗略估算表明,从Java到Kotlin的代码行数减少了大约40%。
[ 同样在InfoWorld上:Devops最佳实践:应该采用的5种方法 ]
From: https://www.infoworld.com/article/3224868/what-is-kotlin-the-java-alternative-explained.html