Kotlin 由浅入深开车啦

Kotlin 由浅入深开车啦

阅读前提:需要对 Java 有所了解,或者最好开发过 Android 应用,其他的?真的不需要了,快上车吧~

作为 Kotlin 的第一篇文章,就先介绍一下这门开发语言的大概吧,图文并茂,希望我能讲的清晰明白,要是有趣一点就更好了~

Kotlin 是什么

先放一张图:

这是官网上的一个截图,可以看出,首先它支持 JVM,100% 兼容 JavaAndroid 。另外,还可以转成 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,不同的是, Unitkotlin 中是一个对象。 另一个不同是 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,可以很好的完成一些模式匹配,来个例子:

循环迭代

whileJava 用法一致 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 或者 ASMenu -> Code ->

转换后的代码除了可能的少量互交互的修改,基本立马可以跑起来。

另一个方便理解 Kotlin 实现原理的工具是 Tools -> Kotlin 下查看编译后的字节码,可以反编译成 Java 代码查看,简直是学习 Kotlin 的利器:

引入 Android 开发

这部分内容网上已经有很多教程,官方 AS 3.0 之后也直接支持了创建包含 Kotlin 模块的 App,就不展开说了。

很开心你能耐心看到现在,第一班车也到站了,期待接下来的文章,我还会努力挤出时间来持续更新,现在 Kotlin 的大门已经打开,接下来就让我们一起一步一步走入 Kotlin 世界的深处吧,朋友们,下期不见不散~


另外原文有任何错误改进之处,欢迎联系我修正改进,任何疑问也可以联系我交流。欢迎订阅点赞哦,不定期更新~

声明:此为原创,转载请联系作者

声明

本文章首次发布于 我的专栏

原文链接

转载于:https://juejin.im/post/5b5dcd5851882519eb65a7a0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值