Kotlin实战【一】Kotlin定义与目的

前言

本系列文章适合有一定java经验的开发者,文章主要内容来自于Dmitry Jemerov的《Kotlin实战》,并加以自己学习过程中的感悟,总结以及实战中的经验。

Kotlin官网

Kotlin中文官网

其他资源(部分需要科学上网):

Android快速转战Kotlin教程

Kotlin官方论坛

Stack Overflow上的Kotlin标签

Kotlin Reddit

Kotlin在线环境

一、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实现上面的功能,代码可能需要多一半。这只是初体验,记不住没关系,没看懂没关系,后面的章节会慢慢深入讲解。

二、Kotlin的主要特征

1、目标平台广泛

(1)Kotlin 的首要目标是提供一种更简洁、更高效、更安全的替代 Java 的语言,并且适用于现今使用 Java 的所有环境,包括web,安卓等

(2)Kotlin 还可以编译成 JavaScript,允许你在浏览器中运行 Kotlin 代码。

2、静态类型

Kotlin 和 Java 一样是一种静态类型的编程语言。这意味着所有表达式的类型在编译期已经确定了,而编译器就能验证对象是否包含了你想访问的方法或者字段。

这与动态类型的编程语言形成了鲜明的对比,后者在 JVM 上的代表包括 Groovy 和 JRuby。这些语言允许你定义可以存储任何数据类型的变量,或者返回任何数据类型的函数,并在运行时才解析方法和字段引用。这会减少代码量并增加创建数据结构的灵活性。但它的缺点是,在编译期不能发现像名字拼写错误这样的问题,继而导致运行时的错误。

静态类型的好处:
- 性能——方法调用速度更快,因为不需要在运行时才来判断调用的是哪个方法。
- 可靠性——编译器验证了程序的正确性,因而运行时崩溃的概率更低。
- 可维护性——陌生代码更容易维护,因为你可以看到代码中用到的对象的类型。
- 工具支持——静态类型使 IDE 能提供可靠的重构、精确的代码补全以及其他特性。

3、函数式和面向对象

作为一个 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特征集

  • 函数类型,允许函数接受其他函数作为参数,或者返回其他函数。
  • 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

例如:

//可以为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自己的标准库的定义,以及Kotlin对标准Java API的扩展。运行时库需要和你的应用程序一起分发。

五、小结

  • Kotlin是静态类型语言并支持类型推导,容许维护正确性与性能的同时保持源代码的简洁。
  • Kotlin支持面向对象和函数式编程两种风格,通过头等函数使更高级别的抽象成为可能,通过支持不可变值简化了测试和多线程开发
  • 在服务端工作很好,全面支持现有的java框架,为常见的任务提供了新工具,如生成HTML和持久化
  • 在安卓上也可以完美支持,为常见的Android开发提供了Kotlin友好的函数
  • 他完全免费和开源,全面支持主流的IDE和构建系统
  • Kotlin务实、安全、简洁、与java可互操作,支持紧凑和易读的代码,以及提供与java无限制的集成。
  • 防止了像NullPointerexceptionClassCastException的发生。

猜你喜欢

转载自blog.csdn.net/github_33304260/article/details/80918791