Android平台的Swift—Kotlin
WeTest 导读
Kotlin 已经出来较长一段时间了,有些同学已经对Kotlin进行了深入的学习,甚至已经运用到了自己的项目当中,但是还有较多同学可能只是听过Kotlin或简单了解过,这篇文章的目的是让这些同学对Kotlin有一个系统全面的认识,让有兴趣的同学在之后学习的时候能更加的轻车熟路。
什么是kotlin?
一、一门静态编程语言
跟java,c一样的强类型语言,变量的数据类型在编译时确定。对比的JavaScript,python则是动态编程语言。
二、JetBrians开发设计
一家捷克的软件公司,是著名的IDE开发商,对很多的开发语言和平台都提供了相应的集成开发环境,比如Java的,OC的,JavaScript,PHP,C/C++等。而其中最著名的是IntelliJ IDEA ,Java的集成开发环境,被称为目前最好用的java IDE。而且Android Studio就是Google基于IntelliJ IDEA 开发的,由此可见Google和JetBrains的合作也是比较密切的。而从以上说明也可以看到JetBrains不仅实力强劲,这家公司对于语言设计更是有天然优势。Kotlin是集多家语言之大成。
三、Kotlin是开源的(基于Apache 2.0开源许可协议)
我们在GitHub上可以下载Kotlin的全部源代码。而且可以自己进行代码修改,再发布。
https://github.com/JetBrains/kotlin
最新版本已经更新到了1.2.3 。
四、Android官方开发语言
JetBrains其实在2011年就推出了Kotlin, 在之后的很长一段时间都处于设计,开发和完善当中,2016年才发布第一个正式版本,而在2017年5月份的Google I/O开发者大会上,被Google宣布称为Android的官方开发语言。
被程序员们称为Android平台的Swift。
Kotlin有哪些优势?
一、 语法简洁,且吸收了很多其他语言的优点
大量的语法糖(有函数声明,类的创建,集合相关,范围运算符等等大量简洁的语法)、 Lambda表达式(Java8支持),简洁的函数表示法,后面会介绍到。
可参考:http://qinghua.github.io/kotlin-syntax-suger/收集的语法糖们。
吸收其他语言的优点有:模板字符串,运算符重载,方法扩展,命名参数等。后面在语言新特性中会讲到。
二、安全性
空安全:避免空指针异常。当变量可以为null时,必须使用可空安全符?进行声明,否则会出现编译错误。声明变量为可空后,在运行时便不会抛出异常。
类型智能转换:通过is进行类型判断后,编译器自动进行类型转换。父类引用可以调用子类接口,注意转换只在is的代码块中生效。
三、完全兼容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。
四、工具支持
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的包装类(基础类型包装成对象)。
2、定义函数
函数使用fun为关键字进行声明。变量的冒号之后是变量类型,函数的冒号之后是返回值。
同时我们可以在定义函数的时候声明参数的默认值。
函数调用的时候可以直接调用,也可以使用命名参数:
使用命名参数可以增加可读性,减少函数的重载。
3、类的声明
类名的冒号表示继承,所有类的基类称为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循环,同时增加了区间控制
5、集合
Kotlin的集合与OC的集合相似,分为可变集合和不可变集合(lists、sets、maps 等)。
kotlin中的可变集合对Java的集合进行了包装,同时它实现了一套不可变集合库。
访问:
6、伴生对象
Kotlin中没有静态属性和方法。如果我们要创建单列,可以使用Object关键字声明类。
如果要在一个类里面声明静态成员,可以在类的内部使用伴生对象。使用关键字companion object
调用的话,直接跟Java一样,通过类名点属性名称或函数名称调用。
二、新特性
1、空安全
Kotlin是如何实现空安全的呢?
在Kotlin中,对象声明分为可空引用和非空引用两种。
非空引用:
可空引用:
安全调用操作符,写作 ?. 可空调用:
通过函数调用给可空引用赋值,返回的必须也是可空引用。这就在编译期间杜绝了空指针异常。但是这里要注意一点,如果从Java返回的集合,不会强制做可空检查,这个是时候如果给不可空引用赋值Java集合中的null会出现转换错误异常。
2、扩展函数
跟OC的Category一样,可以对API的函数进行扩展。
我们在任意Activity中都可以直接调用
函数扩展并不是修改了原来的类,通过反编译成Java代码可以发现,函数的扩展是通过静态导入的方式实现的。
3、字符串模板
表示字符串中可以包含变量或者表达式,以$符号开头(这跟JSP的EL表达式有点像),比如:
Kotlin中是通过单引号进行转义的
4、操作符重载
Kotlin为基本的运算符提供了固定名称函数表,比如
示例:
调用:
5、Lambda表达式
Lambda本质上是一个未声明的函数,他会以表达式的形式传递。既然是函数,就由这三块组成:参数 、 方法体 和 返回值。
我们来看一下完整的Lambda表达式是怎么写的:
大括号内,箭头左边是参数,箭头右侧是方法体和返回值。这里传入两个Int类型的参数,返回一个Int类型的值。
声明一个接受函数为参数的函数:
第二个参数rightV表明接受的是一个函数,函数有两个Int型的入参,返回一个Int型的输出。
调用:
在Android中使用Lambda表达式,可以写成
省略了函数的括号。这里原本不是传入函数类型参数,是编译器做的处理。
注意:listener有多个接口声明时,不能这么使用,比如setOnCheckedChangeListener
三、高级特性
1、高阶函数
把函数作为参数或者是返回值的函数,Kotlin称之为高阶函数。比如函数:
就是一个高阶函数。可以这么调用:
我们声明一个局部函数,然后把他作为参数传递给另一个函数。我们还可以使用Lambda表达式来表示函数参数。
2、泛型
泛型的存在主要是为了消除模板代码和类型转换安全, 在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
3、反射
在运行时获取类的方法,属性,类结构等所有信息。
1)Kotlin中使用Java的反射
jc返回的是Java的class对象,可以通过这个对象去调用调用Java的反射。
2)Kotlin中的反射:
可以不通过KClass对象,直接调用方法和访问属性(注意:如果有重载的函数或同名的属性不能使用以下方式)。
4、协程
什么是协程?
协程是一种新的异步编程方式,它使用线程为资源,基于代码逻辑去实现任务之间的调度。它主要是由编译器去实现的。
程序使用协程可以书写线性的异步代码,没有callback,大大简化了异步编程。线程有的异步操作协程都支持,协程的挂起和切换非常轻量基本没有开销。
如何使用协程?
协程目前虽然还在试验阶段,但是功能已经非常完善了(现在Kotlin最新1.2.3版本,预计1.3会删除实验室状态)。有兴趣的同学可以参考:
https://www.kotlincn.net/docs/tutorials/coroutines-basic-jvm.html
kotlin跨平台
一、多平台支持
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
二、开发多平台项目
Kotlin 多平台项目允许你将相同的代码编译到多个目标平台。 目前支持的目标平台为 JVM 与 JS,即将增加 Native。
目前还是1.2新版本的一个实验性功能。
多平台项目由三种类型的模块组成:
● 公共模块
公用模块只包含与平台无关的Kotlin代码以及Kotlin公共标准库代码。同时还包含不含实现的平台接口声明。
● 平台模块
平台模块可以依赖在指定平台上可用的任何模块与库 (包括对于 Kotlin/JVM 平台的 Java 库与 Kotlin/JS 平台的 JS 库)。
● 常用模块
与平台模块相互依赖的模块
我对Kotlin的看法
1、确实是一门很优秀的语言。语言简洁,包含各种语言的优秀特性。但是一些亮点的特性包含协程和多平台都处于试验和开发阶段。并不能吸引除Java,Android之外的更多开发者加入(JS平台使用的人并不多)。
2、与Java的交互性,让它能够依赖Java成长。但是对Java的依赖和兼容性注定无法完全替换Java。
3、虽然获得Google认可,但是Kotlin语言的热度一直在逐渐下降,发文之前在TIOBE排行榜已经降至49位。我猜测虽然Kotlin获得经验丰富的程序员的青睐,但是对于初中级选手来说他们更愿选择Java这门熟悉的语言。
4、潜力是巨大的,毕竟有Google的官方支持和JetBrains的强劲实力做支撑。如果之后Kotlin在多平台等实验室特性上有所突破的话,绝对会吸引更多的开发者。
学习资料汇总
1.Kotlin官网
2.kotlin中文官网
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/72511994Kotlin Native
腾讯WeTest自动化兼容测试提供云端自动化兼容服务,提交云端百台真机,并行测试。快速发现游戏/应用兼容性和性能问题,覆盖安卓主流机型。目前已经支持所有腾讯在研和运营的手游项目。
欢迎点击链接:http://wetest.qq.com/product/auto-compatibility-testing 使用专家兼容测试服务。WeTest兼容性测试团队期待与您交流!You Create,We Test!
如果对使用当中有任何疑问,欢迎联系腾讯WeTest 企业qq:800024531
Android平台的Swift—Kotlin的更多相关文章
- 【转】Android世界的Swift - Kotlin语言
最近Oracle又在和Google撕的厉害,才知道还有这么Kotlin在Android像Swift在Mac的地位一说. Kotlin是一门与Swift类似的静态类型JVM语言,由JetBrains设计 ...
- 认识一下Kotlin语言,Android平台的Swift
今天在CSDN首页偶然看到一个贴子JetBrains正式公布Kotlin 1.0:JVM和Android上更好用的语言 看完后,感觉Kotlin语法非常简洁,有一系列动态语言的特点,Lambda表达式 ...
- Kotlin:Android世界的Swift
转自:http://www.infoq.com/cn/news/2015/06/Android-JVM-JetBrains-Kotlin Kotlin是一门与Swift类似的静态类型JVM语言,由Je ...
- kotlin, 一种新的android平台一级开发语言
最近看到一则科技新闻, 大致内容是google将kotlin语言作为android应用开发的一级语言, 与java并驾齐驱, 这是一个开发界的大事件大新闻, 连google的亲儿子go语言也没有这种待 ...
- Android Studio中创建Kotlin For Android项目
Kotlin俗称Android中的Swift,它是Jetbrains公司开发的基于JVM的一门语言,JetBrains公司可能大家并不熟悉,不过相信IntelliJ IDE大家一定知道,Android ...
- [译]:Xamarin.Android平台功能——位置服务
返回索引目录 原文链接:Location Services. 译文链接:Xamarin.Android平台功能--位置服务 本部分介绍位置服务以及与如何使用位置提供商服务 Location Servi ...
- Cocos2d-x 3.2 学习笔记(四)学习打包Android平台APK!
从cocos2dx 3.2项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭建一次之后,以后就会非常快捷! (涉及到3.1.1版本的,请自动对应3.2版本,3.x版本的环境搭建都是一样的) ...
- (转)android平台phonegap框架实现原理
(原文)http://blog.csdn.net/wuruixn/article/details/7405175 android平台phonegap框架实现原理 分类: Android2012-03- ...
- Android平台免Root无侵入AOP框架Dexposed使用详解
Dexposed是基于久负盛名的开源Xposed框架实现的一个Android平台上功能强大的无侵入式运行时AOP框架. Dexposed的AOP实现是完全非侵入式的,没有使用任何注解处理器,编织器或者 ...
随机推荐
- 用API给用户添加职责
DECLARE lc_user_name VARCHAR2(100) := 'PRAJ_TEST'; lc_resp_appl_short_name VARCHAR2(100) := 'FND' ...
- 编译GDAL支持ArcObjects
编译GDAL支持ArcObjects. 首先修改nmake.opt文件中对应的ArcObjects,修改后的如下所示: #uncomment to use ArcObjects ARCOBJECTS_ ...
- Android进阶(二十七)Android原生扰人烦的布局
Android原生扰人烦的布局 在开发Android应用时,UI布局是一件令人烦恼的事情.下面主要讲解一下Android中的界面布局. 一.线性布局(LinearLayout) 线性布局分为: (1) ...
- pig代码格式上小注意
1,%default file test.txt 中不要用引号,'' 和""都不行.'file'不会被识别 2,pig判断相等,用==,不是一个=.. 3,pig中只用单引号,不用 ...
- C++实现单链表
之前一直没怎么在意C++中的链表,但是突然一下子让自己写,就老是出错.没办法,决定好好恶补一下该方面的知识,也为今后的数据结构大下个良好的基础,于是我总结出以下几点,有些地方可能不正确,还望大家不吝赐 ...
- [C#]ToString("##")格式化用法案例一:自动编码单据流水码
之前的写的自动编码单据流水码是写在存储过程或者函数中的,今天用程序写一个发现TOSTRING可以格式化方便. /// <summary> /// 年月日+两位流水码 /// </su ...
- Dynamics CRM OData方式进行增删改查时报错的问题
今天在通过OData终结点update记录的时候报"Error processing request stream. The request should be a valid top-le ...
- close()方法应该在finally语句中调用吗?
翻译人员: 铁锚 翻译时间: 2013年12月20日 原文链接: Should .close() be put in finally block or not? 下面列出了关闭输出流(output w ...
- 《高效能程序员的修炼》读后感 By Yong Zhang
想不到我工作中经常GOOGLE搜寻技术问题的stack overflow网站的创办人竟然是<高效能程序员的修炼>一书的作者!看了一遍全书,果然名不虚传. 本书更多的从人文角度而非技术角度去 ...
- redis学习资料
http://www.it168.com/redian/redis/ http://down.51cto.com/data/836008 http://www.redis.cn/