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