Kotlin 由浅入深开车啦
阅读前提:需要对 Java
有所了解,或者最好开发过 Android
应用,其他的?真的不需要了,快上车吧~
作为 Kotlin
的第一篇文章,就先介绍一下这门开发语言的大概吧,图文并茂,希望我能讲的清晰明白,要是有趣一点就更好了~
Kotlin 是什么
先放一张图:
这是官网上的一个截图,可以看出,首先它支持 JVM
,100% 兼容 Java
和 Android
。另外,还可以转成 JS
代码运行在 WEB
上,最后,也是最野心勃勃的一个计划:支持原生开发,也就是可以不依赖于任何虚拟机,可以直接打包编译成本地可执行代码,比如可以运行在嵌入式设备上(如树莓派)。
总结一下就是:Kotlin
是一种现代多平台静态多范式编程语言。
一路走来
Kotlin
核心团队在圣彼得堡,另外还有部分开源贡献者。它名字是来自圣彼得堡周边的一个小岛的名字,官网上的 banner 主图就是这个小岛上的标志性建筑物哦,看起来不错的样子~
闲言少叙,回到正题。
上图展示了对于 Kotlin
比较重要的几个里程碑:10 年立项,12 年开源,16 年第一个正式版本发布(1.0 的 release 我看到的官方发表的状态应该 2016.2.15)终于在 2017 年 GoogleIO 大会上转正,而从今年(2018)GoogleIO 大会上官方数据看,国外已有 35% 的开发者用Kotlin来开发 Android 应用,国内这个数字应该也不会低。这充分说明了 Kotlin 的受欢迎程度。接下来看看为何你需要了解 Kotlin。
为什么要用 Kotlin
简洁
如果你还不了解其中的某些写法,可以先不管,俗话说人人都爱美,就先感受一下这简洁的美好了:)
咳,爱美更要了解其内在,我想图中已经注释的很明白了: 第一个 data class
的例子在 Java
中相同的实现一定会是一页长,而 Kotlin
还帮助生成了一些模版方法(后面文章会讲),所以,看起来够简洁! 第二个例子用到了 lambda
表达式,filter
是一个高阶函数,从字面意思很容易看出这是过滤正数的操作,对比在 Java
中肯定是一个 for
循环啦。 第三个例子声明了一个单例,只需要一个 object
关键字,除此之外,Kotlin 还支持代理等设计模式的简洁处理。
安全
这部分后边也会作为一个专题专门说。 这篇文章中只需要知道Kotlin
的类型系统对可否赋值为 null
做了区分,类型后边带 ? 的表示可空的,否则会有运行时检查并且发生错误时抛出 NPE
。 还需要注意一点, Kotlin
类型系统和 Java
有点区别,前者没有基本类型和对象类型的区分,只是在编译器层面帮我们做了优化处理,所以这方面不用担心性能问题。 与 Java 互操作
这个不必说了,这也是Kotlin
被广大开发者容易接受的一个重要因素,相当于站在了前人的肩膀上,利用现有 JVM
资源,可以说很明智 工具友好
这个更不用说了,IntellJ
自家开发的语言肯定少不了 IDE
的友好支持,这也是一个吸引开发者的因素,不是每个人都是 Vim
Emacs
大神不是? 迁移成本低
图中展示了 “Java
” 风格的 Kotlin
代码,这个是用官方提供的一个小工具转换而成的,非常方便,利于旧代码的迁移,减少了不少工作量。 另外, Kotlin
多范式编程的优势就体现出来了,转换之后的代码几乎没有太大变化,当然,如果你熟悉了之后一定能写出更漂亮的代码,让它更加符合 Kotlin
风格,函数式的风格,随你喜欢。 初识
我相信各位大多数都是在大学把“第一次”献给了 C
或者 Java
,即使如此,当第一次遇见 Kotlin
也会让你再惊艳一次。 有了上边的大概了解,我们现在就赶快来揭开 Kotlin
的面纱吧(迫不及待了呢):)
类型系统
基本类型没有原始类型和装箱类型的区分,不同类型之间不能隐式转换。当然还有可空版本,语法上只是在这些类型后边多加一个?
,以上类型基本上与 Java
是一一对应的。有两个稍微特殊一些: Unit
可以约等于 Java
中的 void
,不同的是, Unit
在 kotlin
中是一个对象。 另一个不同是 Any
对应 Java
中的 Object
,虽然 Any
暴露出来的方法不同,运行时其实是一个东西,可以强转成 Object
而得以调用到被“隐藏”的方法。 空安全
这个特性很好理解,上边说每一种类型都有一个可以容纳 null
的类型,这个就是它的可空版本,一张图就可以说明问题了,看官请看:
Int?
在 Java
中是 int
还是 Integer
呢?留给你思考一下吧~ 这个特性是很棒的特性,在编译期间帮助我们排除大部分可能的 NPE
,刚从 Java
转过来可能会有点感觉束手束脚,因为在 Java
的世界里“自由”惯了,这种良好的编程习惯是该回归了。咳,回到正题,话说 Kotlin
也帮我们提供了一些便捷的方式来处理空判断问题,下边展示的就是其中的两个:
安全调用运算符
Elvis运算符
两张图不用我解释,你肯定也看明白了。除此之外,还提供了一大批 let
also
with
apply
等高阶函数来简化操作,这也会后边的一个重点专题,写到的时候再细说吧。
集合
集合基本是对 Java
集合的封装,这也意味着我们可以几乎无成本迁移过来。Kotlin
为我们实现了大量的集合扩展方法,来帮助我们更加顺畅的写代码,想想就有点小激动呢~
不同之处在于:Kotlin
的集合分为只读集合(不等于不可变)和可变集合。也就是 Kotlin
为我们分离了两种实现,我们可以自由选择。比如我们使用不可变的 List<out E>
,那么我们就无法在 Kotlin
中调用 add
等方法去修改列表,这保证了复杂逻辑和代码中可能产生的不安全问题,也是良好的编码习惯。需要注意的是,当与Java互交互的时候,在 Java
中仍然可以修改它,这是因为 Kotlin
只是在接口层面为我们提供了一种保障,但是并不能限制 Java代码的这种行为。再上一张官方的图,就很清晰了:
List
的泛型前边有一个 out
修饰符,这个会在介绍泛型的时候说,第一班车就不搞这么复杂了,不然中途都下车了:) 流程控制
这部分内容就轻松愉快了,毕竟作为一个程序员,我们日常接触最多的就是和逻辑打交道了,而且这部分内容基本可以参考 Java
以及其他的命令式编程语言。所以主要说说一些不同的点。
分支控制
if else
在是 Kotlin
中是表达式,也就意味着可以写出以下代码(这也很好的替代了三三目运算符):
when
也是表达式,你可以暂时认为是增强版的 switch
,可以很好的完成一些模式匹配,来个例子:
循环迭代
while
和 Java
用法一致 for in
可以迭代任何实现了 Iterable
接口的对象,下面的例子迭代了一个闭区间
for (i in 1..5 step 2).foreach (::println) // 135复制代码
更多集合数据处理相关,后续高阶函数会细讲。
编译与运行时
编译过程和 Java
相同,把源码编译成对应的字节码,Kotlin
生成的是兼容 Java 6
的字节码,另外还有在发展中的针对 7 和 8 的 stdlib
,针对 JVM
平台,Kotlin Runtime
更准确应该叫 Kotlin
支持库。
与现有Java代码一起工作
前边说过,Kotlin
可以和 Java 100%
兼容,所以,一个项目中一次只改一部分文件是可以的,根本不用担心半途而废的问题,你要担心的是用了 Kotlin
不愿意再回去的问题:)
也许你已经迫不及待想要跃跃欲试,用 Kotlin
大显身手一把,在你尝试之前,也许应该看看这个工具: 刚上手的话官方提供了一个比较有趣的转换工具,在 Intellj
或者 AS
中 Menu
-> Code
->
另一个方便理解 Kotlin
实现原理的工具是 Tools
-> Kotlin
下查看编译后的字节码,可以反编译成 Java
代码查看,简直是学习 Kotlin
的利器:
引入 Android 开发
这部分内容网上已经有很多教程,官方 AS 3.0
之后也直接支持了创建包含 Kotlin
模块的 App
,就不展开说了。
很开心你能耐心看到现在,第一班车也到站了,期待接下来的文章,我还会努力挤出时间来持续更新,现在 Kotlin
的大门已经打开,接下来就让我们一起一步一步走入 Kotlin
世界的深处吧,朋友们,下期不见不散~
另外原文有任何错误改进之处,欢迎联系我修正改进,任何疑问也可以联系我交流。欢迎订阅点赞哦,不定期更新~
声明:此为原创,转载请联系作者
声明
本文章首次发布于