Android平台的Swift—Kotlin

WeTest 导读

Kotlin 已经出来较长一段时间了,有些同窗已经对Kotlin进行了深刻的学习,甚至已经运用到了本身的项目当中,可是还有较多同窗可能只是听过Kotlin或简单了解过,这篇文章的目的是让这些同窗对Kotlin有一个系统全面的认识,让有兴趣的同窗在以后学习的时候能更加的轻车熟路。html

 


 

什么是kotlin?

1、一门静态编程语言

跟java,c同样的强类型语言,变量的数据类型在编译时肯定。对比的JavaScript,python则是动态编程语言。java

 

2、JetBrians开发设计

一家捷克的软件公司,是著名的IDE开发商,对不少的开发语言和平台都提供了相应的集成开发环境,好比Java的,OC的,JavaScript,PHP,C/C++等。而其中最著名的是IntelliJ IDEA ,Java的集成开发环境,被称为目前最好用的java IDE。并且Android Studio就是Google基于IntelliJ IDEA 开发的,因而可知Google和JetBrains的合做也是比较密切的。而从以上说明也能够看到JetBrains不只实力强劲,这家公司对于语言设计更是有自然优点。Kotlin是集多家语言之大成。python

 

3、Kotlin是开源的(基于Apache 2.0开源许可协议)

咱们在GitHub上能够下载Kotlin的所有源代码。并且能够本身进行代码修改,再发布。android

 

https://github.com/JetBrains/kotlin git

 最新版本已经更新到了1.2.3 。程序员

 

4、Android官方开发语言

JetBrains其实在2011年就推出了Kotlin, 在以后的很长一段时间都处于设计,开发和完善当中,2016年才发布第一个正式版本,而在2017年5月份的Google I/O开发者大会上,被Google宣布称为Android的官方开发语言。github

被程序员们称为Android平台的Swift。编程

 

Kotlin有哪些优点?

1、 语法简洁,且吸取了不少其余语言的优势

 

大量的语法糖(有函数声明,类的建立,集合相关,范围运算符等等大量简洁的语法)、 Lambda表达式(Java8支持),简洁的函数表示法,后面会介绍到。swift

 

可参考:http://qinghua.github.io/kotlin-syntax-suger/ 收集的语法糖们。segmentfault

 

吸取其余语言的优势有:模板字符串,运算符重载,方法扩展,命名参数等。后面在语言新特性中会讲到。

 

 

2、安全性

 

空安全:避免空指针异常。当变量能够为null时,必须使用可空安全符?进行声明,不然会出现编译错误。声明变量为可空后,在运行时便不会抛出异常。

 

类型智能转换:经过is进行类型判断后,编译器自动进行类型转换。父类引用能够调用子类接口,注意转换只在is的代码块中生效。

 

3、彻底兼容Java

相似于swift于OC的关系,虽然官方推荐使用新语言Kotlin进行Android开发,可是前提新语言必须兼容旧语言(不然是没法获得google的承认的)。因此Kotlin的设计初衷就是要彻底兼容Java。

 

相互调用:使用Kotlin进行Android或者Java服务端开发,能够导入任意的Java库。Kotlin和Java之间能够相互调用。

 

相互转换:在Android Studio中能够一键转换Java代码为Kotlin代码(Code > Convert Java File to Kotlin File.)。同时Kotlin代码也能够反编译成Java代码(1.Tools>Kotlin>Show Kotlin Bytecode 2.Decompile)。

 

Java的API = Kotlin的API。

 

4、工具支持

JetBrains为Kotlin的开发提供了大量的工具支持。咱们能够直接下载Kotlin Compiler库在命令行进行编译和运行,也能够经过安装插件在Eclipse中使用Kotlin,而如今IntelliJ IDEA和Android Studio已经能够直接使用Kotlin进行开发。就像JetBrains所说:一门语言须要工具化,而在 JetBrains,这正是咱们作得最好的地方!

 

Kotlin如何兼容Java?

咱们来看一张图,了解Kotlin的编译过程。

 

Kotlin为何能够兼容Java,一个主要缘由是Kotlin文件在通过Kotlin编译器编译后会生成Java字节码。这跟Java文件经过Java编译器编译后生成的字节码几乎没有区别,这样JVM就能直接识别和处理Kotlin代码的功能和逻辑。

 

当Kotlin调用Java代码,Kotlin编译器会对调用的Java文件进行分析,以便kt文件可以生成正确的class文件。为何这么说呢?举个列子,Java字节码有几种函数调用的方式invokespecial 、 invokeStatic 、 invokeInterface等,编译器必须知道调用的Java函数是什么类型才能生成相应的正确的字节码。而当在Java代码中调用Kotlin对象时,Kotlin生成的class文件也要输入到Java编译器,这时Java文件才能生成正确的class文件。生成的class文件打成jar包后,最终能够生成Android的APK,或供Java服务端调用。

 

咱们能够直接下载下载Kotlin编译器下来查看他的编译过程(最新https://github.com/JetBrains/kotlin/releases/tag/v1.2.40-eap-16)。Kotlin编译器的代码都是用java写的,因此使用Kotlin编译器必需要有java环境。

 

Kotlin的语言特性

1、基础特性

一、 定义变量

 

 Var用来声明变量,Val相似Java final,用来声明常量。语句后面不须要跟分号。变量类型能够根据变量值进行自动推导。这里Kotlin的基础类型都是对象,使用的是Java的包装类(基础类型包装成对象)。

 

二、定义函数

 

函数使用fun为关键字进行声明。变量的冒号以后是变量类型,函数的冒号以后是返回值。

 

同时咱们能够在定义函数的时候声明参数的默认值。

函数调用的时候能够直接调用,也可使用命名参数:

 

使用命名参数能够增长可读性,减小函数的重载。

 

 

三、类的声明

 

 

类名的冒号表示继承,全部类的基类称为Any(并非Object,只包含equals、hascode、toString方法)。声明构造函数要指明constructor关键字。

 

 

也能够直接在声明类的时候指定构造函数。

对象实例化能够不写new关键字:

 

 

数据类,用来保存Info数据的类,其实就是JavaBeans。这里使用一句代码建立一个包含 getters、 setters、 equals()、 hashCode()、 toString() 以及 copy() 的 类。

 

4.、流程控制

其余流程控制基本跟Java差很少,这里主要讲下when表达式,他取代了Java的switch

 

when表达式其实最终是使用if/else来实现的。

保留了原来的for each循环,同时增长了区间控制

 

五、集合

Kotlin的集合与OC的集合类似,分为可变集合和不可变集合(lists、sets、maps 等)。

 

kotlin中的可变集合对Java的集合进行了包装,同时它实现了一套不可变集合库。

 

访问:

 

六、伴生对象

Kotlin中没有静态属性和方法。若是咱们要建立单列,可使用Object关键字声明类

 

若是要在一个类里面声明静态成员,能够在类的内部使用伴生对象。使用关键字companion object

 

调用的话,直接跟Java同样,经过类名点属性名称或函数名称调用。

 

2、新特性

一、空安全

Kotlin是如何实现空安全的呢?

在Kotlin中,对象声明分为可空引用和非空引用两种。

 

非空引用:

 

可空引用:

 

安全调用操做符,写做 ?. 可空调用:

 

经过函数调用给可空引用赋值,返回的必须也是可空引用。这就在编译期间杜绝了空指针异常。可是这里要注意一点,若是从Java返回的集合,不会强制作可空检查,这个是时候若是给不可空引用赋值Java集合中的null会出现转换错误异常。

 

二、扩展函数

跟OC的Category同样,能够对API的函数进行扩展。

 

咱们在任意Activity中均可以直接调用

 

函数扩展并非修改了原来的类,经过反编译成Java代码能够发现,函数的扩展是经过静态导入的方式实现的。

 

三、字符串模板

表示字符串中能够包含变量或者表达式,以$符号开头(这跟JSP的EL表达式有点像),好比:

 

Kotlin中是经过单引号进行转义的

 

四、操做符重载

Kotlin为基本的运算符提供了固定名称函数表,好比

 

 

示例:

 

 

调用:

 

五、Lambda表达式

Lambda本质上是一个未声明的函数,他会以表达式的形式传递。既然是函数,就由这三块组成:参数 、 方法体 和 返回值。

 

咱们来看一下完整的Lambda表达式是怎么写的:

 

大括号内,箭头左边是参数,箭头右侧是方法体和返回值。这里传入两个Int类型的参数,返回一个Int类型的值。 

 

声明一个接受函数为参数的函数:

 

 第二个参数rightV代表接受的是一个函数,函数有两个Int型的入参,返回一个Int型的输出。

 

调用:

 

在Android中使用Lambda表达式,能够写成

 

省略了函数的括号。这里本来不是传入函数类型参数,是编译器作的处理。

 

注意:listener有多个接口声明时,不能这么使用,好比setOnCheckedChangeListener

 

3、高级特性

一、高阶函数

把函数做为参数或者是返回值的函数,Kotlin称之为高阶函数。好比函数:

 

 

就是一个高阶函数。能够这么调用:

 

咱们声明一个局部函数,而后把他做为参数传递给另外一个函数。咱们还可使用Lambda表达式来表示函数参数。

 

二、泛型

泛型的存在主要是为了消除模板代码和类型转换安全, 在Kotlin中泛型的使用基本与Java是一致的。

 

在Java中泛型是不变的,好比:虽然A继承B,但List<A>和List<B>之间没有任何关系,Java是经过泛型通配符来实现型变的:

<? extends T> 对应Kotlin的 out T 生产者

<? super T> 对应Kotlin的  in T 消费者

 

PECS原则 : producer-extends, consumer-super

可是Kotlin中使用比Java的更加灵活,好比能够在类声明的时候添加型变 , 或者函数声明的时候添加。

 

更多能够了解:https://segmentfault.com/a/1190000010313252 写的很是详细。对Java泛型理解的不是很透彻能够再看看 http://www.importnew.com/24029.html

 

三、反射

在运行时获取类的方法,属性,类结构等全部信息。

1)Kotlin中使用Java的反射

 

jc返回的是Java的class对象,能够经过这个对象去调用调用Java的反射。

 

2)Kotlin中的反射:

 

能够不经过KClass对象,直接调用方法和访问属性(注意:若是有重载的函数或同名的属性不能使用如下方式)。

 

四、协程

什么是协程?

协程是一种新的异步编程方式,它使用线程为资源,基于代码逻辑去实现任务之间的调度。它主要是由编译器去实现的。

 

程序使用协程能够书写线性的异步代码,没有callback,大大简化了异步编程。线程有的异步操做协程都支持,协程的挂起和切换很是轻量基本没有开销。

 

如何使用协程?

 

协程目前虽然还在试验阶段,可是功能已经很是完善了(如今Kotlin最新1.2.3版本,预计1.3会删除实验室状态)。有兴趣的同窗能够参考:

https://www.kotlincn.net/docs/tutorials/coroutines-basic-jvm.html

 

kotlin跨平台

1、多平台支持

Kotlin的不只仅用于Java,JetBrains的野心远不止于此。使用Kotlin同时能够用于其余平台的开发。因此市面上以前说Kotlin是一款基于JVM的语言是不许确的。

 

 

Kotlin用于服务端开发:

使用Kotlin可用于Java服务端开发。Java与Kotlin的相互兼容性,咱们可以使用服务端的任意框架,同时咱们能够保留老的Java代码,使用Kotlin编写新代码。Kotlin的协程特性更有助于构建服务端程序。IDE的支持和Sring框架的支持。

 

Kotlin用于Android开发:

Android Studio的支持。大量的实际案列。大量可学习的APP项目。与Java兼容性容许在 Kotlin 应用程序中使用全部现有的 Android 库。

 

Kotlin用于JavaScript:

使用kotlinc-js编译器将Kotlin代码转换为JavaScript(不是Kotlin或标准库的代码编译时会被忽略),Kotlin中提供了一些标准库用于JS开发,同时可使用第三方JS库。

 

Kotlin Native:

Kotlin/Native 是一种将 Kotlin 编译为没有任何虚拟机的原生二进制文件的技术。还在开发中,如今只出了预览版本。

 

预览版本支持: Window 、 Mac 、 IOS 、 Android等平台。Kotlin代码最终会编译成一个kexe文件,直接打开就能够运行。

 

基于Kotlin/Native的一款游戏源码:https://github.com/jetbrains/kotlinconf-spinner

 

2、开发多平台项目

Kotlin 多平台项目容许你将相同的代码编译到多个目标平台。 目前支持的目标平台为 JVM 与 JS,即将增长 Native。

 

目前仍是1.2新版本的一个实验性功能。

 

 

 

多平台项目由三种类型的模块组成:

● 公共模块

公用模块只包含与平台无关的Kotlin代码以及Kotlin公共标准库代码。同时还包含不含实现的平台接口声明。

 

● 平台模块

平台模块能够依赖在指定平台上可用的任何模块与库 (包括对于 Kotlin/JVM 平台的 Java 库与 Kotlin/JS 平台的 JS 库)。

 

● 经常使用模块

与平台模块相互依赖的模块

 

我对Kotlin的见解

一、确实是一门很优秀的语言。语言简洁,包含各类语言的优秀特性。可是一些亮点的特性包含协程和多平台都处于试验和开发阶段。并不能吸引除Java,Android以外的更多开发者加入(JS平台使用的人并很少)。

 

二、与Java的交互性,让它可以依赖Java成长。可是对Java的依赖和兼容性注定没法彻底替换Java。

 

三、虽然得到Google承认,可是Kotlin语言的热度一直在逐渐降低,发文以前在TIOBE排行榜已经降至49位。我猜想虽然Kotlin得到经验丰富的程序员的青睐,可是对于初中级选手来讲他们更愿选择Java这门熟悉的语言。

 

四、潜力是巨大的,毕竟有Google的官方支持和JetBrains的强劲实力作支撑。若是以后Kotlin在多平台等实验室特性上有所突破的话,绝对会吸引更多的开发者。

 

学习资料汇总

1.Kotlin官网

http://kotlinlang.org/

 

2.kotlin中文官网

https://www.kotlincn.net/

 

3.Google Kotlin项目学习实例

https://developer.android.com/samples/index.html?language=kotlin

 

4.阿里巴巴工程师教学系列文章

https://segmentfault.com/u/donghaichenguangjian

 

5.Kotlin协程

https://www.jianshu.com/p/9f720b9ccdea

https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md

https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md

 

6.其余文章

https://blog.csdn.net/u013448469/article/details/79403284 Kotlin反射

https://blog.csdn.net/ztguang/article/details/72511994 Kotlin Native


腾讯WeTest自动化兼容测试提供云端自动化兼容服务,提交云端百台真机,并行测试。快速发现游戏/应用兼容性和性能问题,覆盖安卓主流机型。目前已经支持全部腾讯在研和运营的手游项目。

欢迎点击连接:http://wetest.qq.com/product/auto-compatibility-testing 使用专家兼容测试服务。WeTest兼容性测试团队期待与您交流!You Create,We Test!

腾讯WeTest有奖征文活动进行中,欢迎投稿!了解详情:http://wetest.qq.com/lab/view/379.html

相关文章
相关标签/搜索