Kotlin初学者指南

建站服务器 你好,世界

Kotlin是一种静态类型语言,在JVM上运行,并且与现有Java代码具有100%的互操作性。 对于大多数Java开发人员来说,下面的程序应该非常熟悉:

创新互联建站专业为企业提供青山湖网站建设、青山湖做网站、青山湖网站设计、青山湖网站制作等企业网站建设、网页设计与制作、青山湖企业网站模板建站服务,十余年青山湖做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
包com。bugsnag。科特林;

公共课App{
publicstaticvoidmain(String[]args){
系统。出。println(“HelloWorld!”);
}
}

以下将在 Kotlin中 打印“Hello World” :

funmain(args:Array){
println(“HelloWorld!”)
}

一些差异是显而易见的,例如缺少分号以及我们的代码是多么简洁。

科特林与 Java的

为了了解Kotlin,让我们仔细看看它的功能以及它们与Java的比较。

无安全性

我们将首先探索Kotlin最有用的功能之一 - 它支持null安全性。 在Java中,任何对象都可以 null 。 这意味着必须在整个代码库中添加运行时检查以防止 NullPointerException 崩溃,这通常被 语言设计者 称为 十亿美元的错误 。

静态类用户{
字符串名称;
}

publicvoidprintUsername(Useruser){
如果(用户。名字!=空){
FOO(用户。名。长度());
}
}

在Kotlin中,对象的引用必须是可空的或非空的:

classUser(varname:String?)//name属性可以为null
classUser(varname:String)//name属性不能为null

如果开发人员试图将可以为空的对象传递给第二个类,则会发生编译时错误。

安全呼叫运营商

以下对大多数Java开发人员来说非常熟悉。 所述 user 参数可以是 null ,所以需要运行时检查以确保 NPE 避免。

voidprintUsername(Useruser){
如果(用户。的getName()!=空){
FOO(用户。的getName()长度());
}else{
foo(null);//提供一个null整数
}
}

voidfoo(整数长度){}

Kotlin可以通过 Safe Call 操作员 简化这一过程 。 如果 name 不为null,则其长度将作为参数传递。 否则,将传递空引用。

funprintUsername(user:User){
FOO(用户。名字?。长度)如果user.name为空//返回null
}

funfoo(length:Int?){}

或者,如果在值为null时执行代码没有意义,我们可以使用 let

funfoo(nullableUser:User?){
nullableUser?。let{printUsername(nullableUser)}//只打印非空用户名
}
funprintUsername(user:User){}//User是非空引用

类定义

与Java相比, Kotlin 类 非常简洁。 下面的类定义了三个字段,getter和setter超过30行!

classUser{
最终字符串名称;
intage=18;
字符串地址;

publicUser(Stringname,intage,Stringaddress){
这个。name=name;
这个。年龄=年龄;
这个。地址=地址;
}

publicStringgetName(){
返回名称;
}

publicintgetAge(){
回归年龄;
}

publicvoidsetAge(intage){
这个。年龄=年龄;
}

publicStringgetAddress(){
返回地址;
}

publicvoidsetAddress(Stringaddress){
这个。地址=地址;
}
}

在Kotlin中,我们可以使用一行代码实现相同的功能。

classUser(valname:String,varage:Int=18,varaddress:String?)

不可变引用也更容易。 这只是从 var 关键字 切换 到的问题 val

您可能已经注意到,对于Kotlin,可以为参数提供默认值。 这意味着 可以在Kotlin中消除 Java模式,例如 Builder模式 。 这也可以大大减少语法糖所需的代码量,例如公共API中的方法链。

数据类

如果我们类的主要目的是保存数据,例如来自API的JSON有效负载,事情会变得更加简洁。 在Kotlin中,这些被称为 数据类 。

dataclassUser(valname:String,varage:Int=18,varaddress:String?)

只需添加 data 关键字会自动生成 equals() hashCode() toString() ,并 copy() 为我们的类实现。 省略了此类的等效Java实现,以节省读者的理智和带宽成本。

类型推断

Kotlin使用类型推断,这进一步增加了它的简洁性。 考虑一下这个Java类:

classAbstractSingletonProxyFactoryBean{}

publicvoidfoo(){
AbstractSingletonProxyFactoryBeanbean=newAbstractSingletonProxyFactoryBean();
}

而Kotlin中的等价物看起来像这样:

classAbstractSingletonProxyFactoryBean

funfoo(){
valbean=AbstractSingletonProxyFactoryBean()//自动推断类型
}

功能

类型推断渗透到整个语言中。 在需要时可以是显式的或隐式的,如下面定义相同函数的两种方法所示:

intadd(inta,intb){
返回a+b;
}

funadd(a:Int,b:Int):Int{//显式返回类型
返回a+b
}

funadd(a:Int,b:Int)=a+b//推断的返回类型

属性

Kotlin Properties 简直太棒了。 考虑以下Java类,它使用访问器方法定义单个字段:

classBook{
字符串作者;

StringgetAuthor(){
回归作者;
}

voidsetAuthor(Stringauthor){
这个。作者=作者;
}
}

书书=新的图书();
书。setAuthor(“KurtVonnegut”);
系统。出。的println(书。getAuthor());

通过定义声明 author 属性 的类,可以在Kotlin的四行中实现等效功能 。 我们将自动生成我们的getter和setter:

classBook(varauthor:String?)
valbook=书()
书。author=“KurtVonnegut”
println(书。作者)

自定义访问者

如果getter和setter需要自定义行为,则可以覆盖默认行为。 例如:

classPerson(varfirstName:String,varlastName:String){

varfullName:String
get()=“${firstName}${lastName}”
set(value){
valsplit=value。拆分(“”)
firstName=split[0]
lastName=split[1]
}
}

如果我们需要验证字段或将其限制为某些输入, 也可以使用 支持字段 :

set(value){
如果(“圣诞老人”。等于(值))字段=“蚝HO”
}

互通性

Kotlin的另一个优点是可以从同一个项目中的Java代码中调用它,反之亦然。

公共类MyJavaClass{
publicStringauthorName;

publicbooleanisTruthyValue(){
返回true;
}
}

以下Kotlin函数实例化一个新的Java对象,并使用常规的Kotlin语法访问其方法和字段。 如果您想通过向现有Java代码库添加少量Kotlin来将脚趾浸入水中,这将非常方便。

funmain(args:Array){
valobj=MyJavaClass()
的println(OBJ。AUTHORNAME)
的println(OBJ。isTruthyValue)
}

还值得一提的是,Kotlin可以 反编译回Java ,因此如果您的团队不喜欢该语言或遇到技术障碍,那么完全可以迁移回来。

实用方法

所有Java开发人员都会非常熟悉实用程序或帮助程序类。 静态方法将执行Java标准库中不可用的一些有用操作,并将在代码库中调用:

classStringUtils{
staticStringsortStringChars(Stringinput){
char[]chars=输入。toCharArray();
数组。排序(字符);
returnnewString(chars);
}
}
StringUtils。sortStringChars(“azbso”);//返回“abosz”

在Kotlin中, 扩展 允许将其他功能添加到现有类中, 无需扩展或包装该类。 例如,以下内容将向 该类 添加一个 sortStringChars 函数 String

有趣的字串。sortStringChars():String{
valchars=这个。toCharArray()
数组。排序(字符)
returnString(chars)
}

funmain(args:Array){
“azbso”。sortStringChars()//返回“abosz”
}

这导致语法更易读 - 但要注意。 强大的力量带来了 巨大的责任 。

功能编程

Kotlin完全支持lambda表达式。 有限的Java 8支持刚刚 添加到Android中 ,这使得Kotlin的功能编程功能特别受欢迎。

//为名称以“J”开头的所有作者筛选一个列表
valinput=listOf(“JK罗琳”,“查尔斯达尔文”)
valauthors=输入。过滤器{作者->作者。startsWith(“J”)}
println(作者)//JK罗琳

也可以 在Collections上 使用诸如 filter map 直接 构造 ,这在大多数Android设备上目前都不支持。

funmain(args:Array){
valinput=listOf(“JK罗琳”,“查尔斯达尔文”,“”)
valauthors=输入。过滤{!它。isEmpty()}//删除空值
。map{Author(it)}//将字符串映射到作者对象
。sortedBy{it。name}//按作者名排序

println(authors)//按字母顺序打印作者
}

Reactive Streams最近在Android世界中流行起来, RxKotlin 库 也为Kotlin提供了支持 。

valcereals=listOf(“KellogsCoroutines”,“CocoaPods”,“LockyCharms”)

谷物。toObservable()

//在后台线程上执行一些密集/复杂的计算

。subscribeBy(onNext={
println(it)//观察主线上的每个谷物并打印出来
})

Kotlin Native和Javascript

Kotlin主要针对JVM,但也可以 使用LLVM工具链 转换为Javascript 或编译为本机代码。 这两个目标在开发阶段还处于初期阶段,但对于希望在整个堆栈中使用一种语言进行编程的人来说,这显示了很大的希望。

Kotlin Native特别有趣,因为Swift 看起来与Kotlin非常相似 ,这意味着有朝一日可能会在Android和iOS应用程序中使用相同的本机代码库。

另一个值得一提的是 Gradle Script Kotlin ,它将静态类型的所有好处带到现有的Gradle DSL和 Spring Boot ,后者为Kotlin提供官方支持 1.5

潜在的下行

那么Kotlin的缺点是什么?

在Android上,应用程序大小是一个潜在的问题。 Kotlin目前 为您的应用程序大小 增加了大约 1Mb, 并使用了大约7,000种方法,尽管其中大部分都可以被 Proguard 剥离 。 对于传统的Java桌面应用程序来说,这不是什么大不了的事,但对于拥有更多资源限制的移动设备,这对某些团队来说可能是一个交易破坏者。

Kotlin并没有和Java一样长,因此,识别不良做法和代码味道要困难得多。 Java有22年的良好实践和linting工具可供借鉴,而Kotlin却没有。 例如,扩展函数是一个非常强大的功能,但可以轻松地用于应该使用类和抽象的地方。

更人性化的因素是尽管Kotlin与Java非常相似; 学习一门新语言总会有一段时间,这会导致生产力暂时下降。

特别是如果团队中的每个人都在过去十年中成为Java专家,他们可能不愿意放弃并以他们不熟悉的语言重新开始。 外部客户可能对Kotlin感到不太满意,因为有人认为它与Java一样久不存在,并且更为未知。

为什么Kotlin击败Java

让我们总结一下Kotlin的一些主要优点:

科特林是 比Java更简洁

Lambdas和功能构造已经开箱即用多年

100%与现有Java代码的互操作性

Kotlin实际上消除了最常见的Java错误之一,可怕的 NullPointerException

IntelliJ IDEA提供出色的工具支持

这种语言是从头开始编写的,因此,它 就像是每天都在其中编程的人设计的语言

我们认为,由于这些原因,Kotlin在Android上击败了Java。 在传统的Java桌面应用程序中,由于Java 8包含可比较的语言功能,例如lambda,流和其他,因此它是一个更接近的竞争。 但是,我们仍然相信Kotlin的简洁性在这种情况下获胜。

关于Kotlin入门的建议

在一篇博客文章中总结一下编程语言是不可能的,所以如果你或你的团队有兴趣使用Kotlin,我们的建议只是试一试!

最常见的两条路线是在Kotlin中编写单元测试或将现有的Utils类转换为Kotlin。 IntelliJ IDEA还提供了一个方便的自动转换快捷方式,可将现有Java代码迁移到Kotlin。 虽然这不一定会给你最惯用的Kotlin,但它是一种在你熟悉的代码库中学习语法的好方法。

最重要的是不断评估每个人是否对Kotlin的采用水平感到满意,并确定任何痛点或隐藏的陷阱。

Kotlin是Java的一个非常好的替代品,如果做得好,它有可能提高开发人员的快乐,降低代码库的复杂性,并提高业务的生产力。


分享文章:Kotlin初学者指南
URL分享:http://scyanting.com/article/cppjhe.html