前言
本系列文章适合有一定java经验的开发者,文章主要内容来自于Dmitry Jemerov的《Kotlin实战》,并加以自己学习过程中的感悟,总结以及实战中的经验。
Kotlin官网
Kotlin中文官网
其他资源(部分需要访问外国网站):
Android快速转战Kotlin教程
Kotlin官方论坛
Stack Overflow上的Kotlin标签
Kotlin Reddit
Kotlin在线环境
一、Kotlin初体验
没错,如下图,纵享丝滑~~~~~~~~~~~~~~~
kotlin,用过的都说好,你好、我好、大家好!!!!!!!!!!!!!!!
我们来举个栗子:
创建一个Person类来表示一个“人”,创建一个“人”的集合,查找其中年纪最大的人,并打印结果。
代码语言:javascript复制data class Person(val name: String,
val age: Int? = null)
fun main(args: Array<String>) {
val persons = listOf(Person("Alice"),
Person("Bob", age = 29))
val oldest = persons.maxBy { it.age ?: 0 }
println("The oldest is: $oldest")
}
输出:The oldest is: Person(name=Bob, age=29)
我们来依次解析:
代码语言:javascript复制"数据"类 ,括号中是参数,可空类型(?=),如果没有传该参数,则为null
data class Person(val name: String,
val age: Int? = null)
代码语言:javascript复制"顶层函数"
fun main(args: Array<String>) {}
代码语言:javascript复制其中 "age = 29" 是命名参数
Person("Bob", age = 29))
代码语言:javascript复制lambda表达式;Elvis运算符(左边的值不为空时返回值,否则返回右边的数据)
val oldest = persons.maxBy { it.age ?: 0 }
代码语言:javascript复制kotlin的String拼接方式 相当于String s = "aaa" "bbb" "ccc"
"The oldest is: $oldest"
有没有开始喜欢kotlin了,如果要用java实现上面的功能,代码可能需要多一半。这只是初体验,记不住没关系,没看懂没关系,后面的章节会慢慢深入讲解。
二、Kotlin的主要特征
1、目标平台广泛
(1)Kotlin 的首要目标是提供一种更简洁、更高效、更安全的替代 Java 的语言,并且适用于现今使用 Java 的所有环境,包括web,安卓等
(2)Kotlin 还可以编译成 JavaScript,允许你在浏览器中运行 Kotlin 代码。
2、静态类型
Kotlin 和 Java 一样是一种静态类型的编程语言。这意味着所有表达式的类型在编译期已经确定了,而编译器就能验证对象是否包含了你想访问的方法或者字段。
这与动态类型的编程语言形成了鲜明的对比,后者在 JVM 上的代表包括 Groovy 和 JRuby。这些语言允许你定义可以存储任何数据类型的变量,或者返回任何数据类型的函数,并在运行时才解析方法和字段引用。这会减少代码量并增加创建数据结构的灵活性。但它的缺点是,在编译期不能发现像名字拼写错误这样的问题,继而导致运行时的错误。
静态类型的好处: - 性能——方法调用速度更快,因为不需要在运行时才来判断调用的是哪个方法。 - 可靠性——编译器验证了程序的正确性,因而运行时崩溃的概率更低。 - 可维护性——陌生代码更容易维护,因为你可以看到代码中用到的对象的类型。 - 工具支持——静态类型使 IDE 能提供可靠的重构、精确的代码补全以及其他特性。
3、函数式和面向对象
作为一个 Java 开发者,你一定对面向对象编程的核心概念烂熟于胸,但函数式编程对你来说却可能不是很熟悉。
函数式编程的核心概念如下 : - 头等函数——把函数(一小段行为)当作值使用,可以用变量保存它,把它当作参数传递,或者当作其他函数的返回值。 - 不可变性——使用不可变对象,这保证了它们的状态在其创建之后不能再变化。 - 无副作用——使用的是纯函数。此类函数在输入相同时会产生同样的结果,并且不会修改其他对象的状态,也不会和外面的世界交互。
例子:
代码语言:javascript复制//=====过程式代码=====:
fun main(args: Array<String>) {
val ints = listOf(1, 2, 3, 4, 5)
var sum = 0
for (i in ints) sum = i
sum.log()
// Log 15
}
代码语言:javascript复制//===== 函数式代码=====:
fun main(args: Array<String>) {
val ints = listOf(1, 2, 3, 4, 5)
ints.fold(0){ a, b -> a b }.log()
// Log 15
}
优点:
(1)简练:函数式风格的代码 比相应的命令式风格的代码更优雅、更简练,因为把函数当作值可以让你获得更强 大的抽象能力,从而避免重复代码。 熟悉RxJava和java8的童鞋应该有所感受。
(2)安全:多线程程序中最大的错误来源之一就是,在没有采用适当同步机制的情况下,在不同的线程上修改同一份数据。如果你使用的是不可变数据结构和纯函数,就能保证这样不安全的修改根 本不会发生,也就不需要考虑为其设计复杂的同步方案。
(3)测试容易:没有副作用的函数可以独立地进行测试,因为不需要写大量的设置代码来构造它们所依赖的整个环境。
Kotlin特征集
- 函数类型,允许函数接受其他函数作为参数,或者返回其他函数。
- lambda 表达式,让你用最少的样板代码方便地传递代码块
- 数据类,提供了创建不可变值对象的简明语法
- 标准库中包括了丰富的 API 集合,让你用函数式编程风格操作对象和集合
Kotlin 允许你使用函数式编程风格但并没有强制你使用它。当你需要的时候,可以使用可变数据,也可以编写带副作用的函数,而且不需要跳过任何多余的步骤。然后,毫无疑问的是,在 Kotlin 中使用基于接口和类层次结构的库就像 Java 一样简单。当编写 Kotlin 代码的时候,可以结合使用面向对象编程和函数式编程风格,并使用最合适的工具来对付亟待解决的问题。
4、免费并开源
Kotlin 语言(包括编译器、库和所有相关工具)是完全开源的,并且可以自由使用。它采用 Apache 2 许可证 ;其开发过程完全公开在 kotlin上,并且欢迎来自社区的贡献。如果你要开发 Kotlin 应用程序,有三种开源 IDE 供你选择 :IntelliJ IDEA Community2 版、Android Studio 以及 Eclipse,它们都完 全支持 Kotlin(当然,IntelliJ IDEA Ultimate 也支持 Kotlin。)
三、Kotlin设计哲学
1、务实
Kotlin不是一门研究性语言,没有试图提升编程语言设计领域目前的技术水平,也没有尝试计算机科学的创新理念,而是尽可能依赖现有编程语言,来降低语言的复杂性,让他更容易学习。
同时,IDE的支持也对Kotlin的支持也非常完美,对探索发挥着重要作用。许多情况下,工具会提示开发者更简洁的结构替换通用代码模式。
2、简洁
举个例子:java需要1000行完成的功能,Kotlin只需要300行,就是这么霸气。
Kotlin保证你写的代码具有实际意义。而且代码越简单,你就能越快了解发生了什么。
3、安全
最显著地是NullPointerexception
可以被扼杀在摇篮之中。Kotlin的类型系统跟踪哪些可以或不可以为null的值,并且禁止哪些运行时可能导致的NullPointerexception
。
例如:
代码语言:javascript复制//可以为null
val s:String ?= null
//不能为null
val s:String = ""
同时Kotlin有助于避免:ClassCastException
,Kotlin中检查和转换被组合成一次操作,一旦检查过该类型,就不需要额外的转换就可以直接引用这个类型的成员。 例如:
if(value is String){ // 类型检查
println(values.toUpperCase()) //直接调用该类型的方法,不用额外的类型转换
}
4、互操作性
我们任然可以使用现有的库,可以调用java的方法,继承java的类和实现java的接口,在Kotlin类上使用java的注解等等。 而且我们Koltin调用java,亦或java调用kotlin都毫不费力。
不光如此IDE的支持也是完美: - 自由的在java和Kotlin源码文件之间切换 - 调试混合语言的项目,可以在不同语言编写的代码之中单步调试 - 重构java方法的时候,kotlin代码中的对他们的调用也会得到更新 - 重构kotlin方法的时候,java代码中的对他们的调用也会得到更新
四、Kotlin的编译过程
Kotlin的源代码存放在后缀名为.kt
的文件中。Kotlin的编译器会分析源码并生成.class
字节码文件,这和java编译过程相同。
kotlin中 - 你只需
kotlinc
命令就可以编译代码,生成.class
文件;然后java执行代码 java中 - 你只需javac
命令就可以编译代码,生成.class
文件;然后java执行代码
下图,kotlin编译过程流程图
kotlin编译器编译的代码依赖kotlin运行时库,如上图,他包括Kotlin自己的标准库的定义,以及Kotlin对标准Java API的扩展。运行时库需要和你的应用程序一起分发。
五、小结
- Kotlin是静态类型语言并支持类型推导,容许维护正确性与性能的同时保持源代码的简洁。
- Kotlin支持面向对象和函数式编程两种风格,通过头等函数使更高级别的抽象成为可能,通过支持不可变值简化了测试和多线程开发
- 在服务端工作很好,全面支持现有的java框架,为常见的任务提供了新工具,如生成HTML和持久化
- 在安卓上也可以完美支持,为常见的Android开发提供了Kotlin友好的函数
- 他完全免费和开源,全面支持主流的IDE和构建系统
- Kotlin务实、安全、简洁、与java可互操作,支持紧凑和易读的代码,以及提供与java无限制的集成。
- 防止了像
NullPointerexception
和ClassCastException
的发生。