给 Java 开发者的 Kotlin 快速上手教程(Kotlin for Java Developers)v0.1

给 Java 开发者的 Kotlin 快速上手教程(Kotlin for Java Developers)v0.1

Kotlin 概述: 开启 Kotlin 之旅

Google在2017年的IO大会上宣布,将Android开发的官方语言更换为Kotlin。

Java的辉煌与阴影

1995年,当年如日中天的Sun公司发布了Java语言,引起了巨大的轰动,与当时主流的C语言和Basic语言比起来,Java语言简单、面向对象、稳定、与平台无关、解释型、多线程、动态等特点,就像是打开了一个新的世界,一时间风靡全球,云集者众,微软为了模仿Java搞出C#语言,Netscape为了赶时髦硬塞出一个JavaScript语言,IBM则捏着鼻子做了Java IDE Eclipse(日蚀,呵呵)。直到现在,Java在编程世界里还占据着举足轻重的地位,Andy Rubin在开发Android系统时,也很自然地采用了Java和C++(C++负责NDK开发)作为开发语言。

但是,Java毕竟是20多年前的语言了,虽然有不断扩展更新,但是底层设计思想是很难改动的,这就导致它很难实现一些新的语言特性,例如函数式编程、Lambda 表达式、流式API、高阶函数、空指针安全等(虽然Java8实现了部分特性,但是Android还不怎么支持Java8),这些新的语言特性大受好评,可以说解放了编程的生产力,这其实也说明了一个事实:开发效率/时间是软件公司真正的瓶颈,任何能压缩代码量,提高开发效率的举措,都应该受到重视。

而且,Android还存在Java版权危机的问题,收购了Sun公司的Oracle曾向Google索要巨额的Java版权费,这可能也加快了Google寻找Android开发替代语言的动作。

苹果公司已经在用Swift语言替代Object-C语言,Google也找到了替代Java的语言,也就是JetBrains公司(Android Studio也是用该公司的Intelli J改的)主推的Kotlin。

其实,Swift和Kotlin还挺相似的,有一篇Swift is like Kotlin对这两种语言做过简单的对比。

Kotlin的出现

Kotlin也是基于JVM设计的编程语言,算是对Java的温和改良,她是一个开源项目的成果,拥有很高的声望,很多公司、组织、业界大犇都很喜欢她,Square公司的 JakeWharton 大神(Dagger、ButterKnife、Retrofit、OkHttp…之父)就专门写了篇Using Project Kotlin for Android为Kotlin站台。

相对Java来说,Kotlin在编写代码时有如下优势:代码简洁高效、函数式编程、空指针安全、支持lambda表达式、流式API等。

执行效率上,Kotlin和Java具有同样的理论速度(都是编译成JVM字节码)。

另外,新语言必须考虑兼容性,为了与存量项目代码和谐共处,Kotlin和Java是互相完美兼容的,两种代码文件可以并存代码可以互相调用文件可以互相转换,库文件也可以无障碍地互相调用,据说使用Kotlin基本不会带来额外的成本负担。

编程语言本质上还是工具,要运用工具提高效率和质量
(鏈接:https://www.jianshu.com/p/bb53cba6c8f4)

Java 有哪些问题/h3>
  • 空引用(Null references):连空引用的发明者都成这是个 billion-dollar 错误(参见)。不论你费多大的功夫,你都无法避免它。因为 Java 的类型系统就是不安全的。
  • 原始类型(Raw types):我们在开发的时候总是会为了保持兼容性而卡在范型原始类型的问题上,我们都知道要努力避免 raw type 的警告,但是它们毕竟是在语言层面上的存在,这必定会造成误解和不安全因素。
  • 协变数组(Covariant arrays):你可以创建一个 string 类型的数组和一个 object 型的数组,然后把 string 数组分配给 object 数组。这样的代码可以通过编译,但是一旦你尝试在运行时分配一个数给那个数组的时候,他就会在运行时抛出异常。
  • Java 8 存在高阶方法( higher-order functions ),但是他们是通过 SAM 类型 实现的。SAM 是一个单个抽象方法,每个函数类型都需要一个对应的接口。如果你想要创建一个并不存在的 lambda 的时候或者不存着对应的函数类型的时候,你要自己去创建函数类型作为接口。
  • 泛型中的通配符:诡异的泛型总是难以操作,难以阅读,书写,以及理解。对编译器而言,异常检查也变得很困难。
  • 不够灵活,缺乏扩展能力:我们不能给不是我们自己写的 types、classes 或者 interfaces 增加新的方法。长时间以来,我们都会采用 util 类,杂乱无章地堆砌着我们代码或者或者揉在同一个 util package 里面。如果这是解决方案的话,它肯定不理想。
  • 语法繁琐,不够简洁:Java 肯定不是最简洁的语言。这件事本身不是件坏事,但是事实上存在太多的常见的冗余。这会带来潜在的错误和缺陷。在这之前,我们还要处理安卓 API 带来的问题。

Kotlin 是什么/h3>
  • Kotlin 编程语言是一种现代语言,简洁,安全,实用,专注于与Java代码的互操作性。

它几乎可以在今天使用Java的任何地方使用:用于服务器端开发,Android应用程序等等。

Kotlin与所有现有的Java框架100%兼容,并且具有良好的工具支持。它是一种实用的语言,具有非常低的学习曲线,可以被Java开发人员快速掌握。 Kotlin代码不仅可以编译为JVM字节码,还可以编译为JavaScript和Native代码

Kotlin Features

  • Lambda 表达式
  • 数据类 (Data classes)
  • 函数字面量和内联函数(Function literals & inline functions)
  • 函数扩展 (Extension functions)
  • 空安全(Null safety)
  • 智能转换(Smart casts)
  • 字符串模板(String templates)
  • 主构造函数(Primary constructors)
  • 类委托(Class delegation)
  • 类型推断(Type inference)
  • 单例(Singletons)
  • 声明点变量(Declaration-site variance)
  • 区间表达式(Range expressions)

核心的目标

  • 简约:帮你减少实现同一个功能的代码量。
  • 易懂:让你的代码更容易阅读,同时易于理解。
  • 安全:移除了你可能会犯错误的功能。
  • 通用:基于 JVM 和 Javascript,你可以在很多地方运行。
  • 互操作性:这就意味着 Kotlin 和 Java 可以相互调用,目标是 100% 兼容。

基本语法

定义包

定义函数

定义局部变量

  • val

val大致相当于Java里的final,C/C++里的const,Swift里的let,ES6中的const, 使用val定义的是不可重新赋值的变量。

  • var
    • 定义可重复赋值(读写)的变量使用var关键字。var定义的变量就是大部分编程语言里的普通变量,可读写,可重新赋值,Swift也是使用var。 ES6中用的是 let。注意哦。

字符串模板

  • Kotlin支持许多动态语言早就支持的字符串模板,与Groovy和Swift类似

条件表达式

  • if
    • Kotlin中的if语句和Java类似

使用if表达式,上面的函数可以简化成这样

  • when
    • Kotlin增加的Java没有的when表达式,支持强大的类型匹配功能,这里是一个简单的例子

空值检查

  • Kotlin中,如果一个值可能为null就必须显式标示为nullable,使用问 下面的函数返回可能为null

使用返回值可能为null的函数

类型检查和自动转换

  • is操作符用于检查某个对象是否是指定的类型,检查完成后自动转换为指定的类型,无需再显式转换

下面的例子可能更清晰一些

甚至可以这样写

循环语句

  • for
    • for循环使用in操作符,相当于Java的冒

或者这样写,带下标遍历数组


  1. 声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年10月8日
下一篇 2018年10月8日

相关推荐