第一章 Kotlin:定义和目的
一、Kotlin 的主要特征
1,静态类型
Kotlin 和 Java 一样是一种静态类型的编程语言。
- 静态语言:所有表达式的类型在编译器已经确定了,而编译器就能验证对象是否包含了你想访问的方法或者字段。
- 动态语言:可以定义存储任何数据类型的变量,在运行时才解析方法和字段引用。
如下 Kotlin 代码:
val x = 1;
既然是静态语言, x 前面为什么不是 int ?
* 与 Java 不同,Kotlin 不需要你在源代码中显示地声明每个变量的类型。因为大多数情况下,变量类型可以根据上下文来自动判断,这样就可以省略类型声明。如上代码,Kotlin 自动判断出它的类型是 Int 。编译器这种从上下文推断变量类型的能力被称为 类型推导 。
由于 Kotlin 对 类型推导 的支持,我们就不再需要显示地声明类型,因此大部分关于静态类型的额外冗长代码就不复存在了。
一些静态语言的好处:
* 性能:方法调用速度更快,因为不需要在运行时才来判断调用的是哪个方法。
* 可靠性:编译器验证了程序的不确定性,因而运行时崩溃的概率更低。
* 可维护性:陌生代码更容易维护,因为你可以看到代码中用到的对象的类型。
* 工具支持:静态类型使 IDE 能提供可靠的重构,精确的代码补全以及其他特性。
2,函数式和面向对象
函数式编程的的核心概念如下:
* 头等函数:把函数(一小段行为)当做值使用,可以用变量保存它,把它当做参数传递,或者当做其他函数的返回值。
* 不可变性:使用不可变对象,这保证了它们的状态在其创建之后不能再变化。
* 无副作用:使用的是纯函数。此类函数在输入相同时会产生同样的结果,并且不会修改其他对象的状态,也不会和外面的世界交互。
函数时变成风格的代码能带来什么好处呢?首先,简洁 ,其次,多线程安全 。
简洁 :把函数当做值可以让你获得更强大的抽象能力,从而避免重复代码。
假设你有两段类似的代码,完成相似的任务(例如,在集合中找到一个匹配的元素),但具体实现不同(如何判断元素是匹配的)。此时你可以将这段逻辑中的公有部分提取到一个函数中,并将其他不同的部分作为参数传递给它。注意,这些参数本身也是函数(判断元素匹配的逻辑),此时可以使用一种简洁的语法来表示这些匿名参数,没错,就是 lambda表达式 。
<!--findAlice和findBob这两个函数封装了寻找一个人的公共逻辑-->
<!--大括号中的代码识别出你要找的人-->
fun findAlice() = findPerson{it.name== "Alice"}
fun findBob() = findPerson{it.name== "Bob"}
多线程安全 :多线程程序中最大的错误来源之一就是,在没有采用适当同步机制的情况下,在不同的线程上修改同一份数据。如果你使用的是不可变数据结构和纯函数,就能保证这样不安全的修改根本不会发生,也就不需要考虑为其设计复杂的同步方案。
另外,函数式编程意味着测试更加容易,没有副作用的函数(完美的单一职责原则)可以独立的进行测试,不需要写大量的设置代码来构造他们所依赖的整个环境。
Java 8 之前的版本并不支持函数式编程。
Kotlin 拥有丰富的特性集从一开始就支持函数式编程风格,包括:
* 函数类型,允许函数接受其他函数作为参数,或者返回其他函数。
* Lambda 表达式,让你用最少的样板代码方便地传递代码块。
* 数据类,提供了创建不可变值对象的简明语法。
* 标准库中包括了丰富的 API 集合,让你用函数式编程风格操作对象和集合。
二、Kotlin 应用
Kotlin 使用的两个领域是服务器端和 Android 开发。下面来看看为什么 Kotlin 非常适合它们。
1,服务端的 Kotlin
服务端编程是一个非常大的概念,它包含了所有下列的应用程序类型甚至更多:
* 返回 HTML 页面给浏览器的 Web 应用程序
* 通过 HTTP 暴露 JSON API 的移动应用后端服务
* 通过 RPC 协议互相通信的微服务
暂时不考虑使用 Kotlin 开发后端,后面的不写了。
2,Android 上的 Kotlin
Kotlin 的语言特性,加上支持 Android 框架的特殊编译插件,让 Android 的开发体验变得高效和愉悦。(很多代码会被简化的很方便)
使用 Kotlin 带来的另一优势就是更好的应用可靠性。此处是由于 Kotlin 的类型系统通过精确地跟踪 Null 值,大大减轻了空指针异常问题带来的压力。
Kotlin 完全兼容 Java 6。
Kotlin 编译器生成的代码执行起来和普通的 Java 代码效率一样。
三、Kotlin的设计哲学
当谈起 Kotlin 的时候,我们喜欢说它是一门务实、简洁和安全的语言,专注于互操作性。
都是什么意思?
1,务实
Kotlin 被设计出来是用于解决问题的,它不是一门研究性语言(为了提升编程语言设计领域目前的技术水平,尝试探索计算机科学的创新概念等待)。
Kotlin 在设计时,被尽可能地依赖已经出现在其他编程语言并被证明是成功的那些特性和解决方案,这降低了语言的复杂性,也使它更容易想学习。
2,简洁
Kotlin 的语法特性,会尽量保证开发者写的代码都具有实际的意义,而不是仅仅为了满足代码结构的需要。( Java 中的 getter、setter 在 Kotlin 中都是隐式的)
另一个导致代码变得不必要冗长的原因是编写显示的代码来完成常见的任务,比如定位集合中的元素,Kotlin 有丰富的标准库来代替这些冗长重复的代码段。
3,安全
Kotlin 对空指针和类型转换异常有更好的处理。
4,互操作性
Kotlin 与 Java 之间可以非常便捷的互相调用。这使得在项目任何地方都可以出现 Kotlin 和 Java 的混用。
IDE 支持 Kotlin 与 Java 的转换器,可以直接将二者代码互相转换。
Kotlin 最大程度上使用现有的 Java 库。
IDE的跨语言工作特性:
* 自由地在 Java 和 Kotlin 源码文件之间切换。
* 调试混合语言的项目,可以在不同语言编写的代码之中单步调试。
* 重构 Java 方法的时候,Kotlin 代码中的对它们的调用也会得到正确的更新,反之亦然。
四、使用 Kotlin 工具
和 Java 一样,Kotlin 也是编译型语言,这意味着你必须先编译,然后才能执行 Kotlin 代码。
1,编译 Kotlin 代码
Kotlin 的源代码存放在 .kt
的文件中( Java 的存放在 .java
的文件中)。Kotlin 编译器会分析源代码并生成 .class
文件,这和 Java 编译器做的没什么不同。
2,Intellij IDEA 和 Android Studio 插件
Intellij IDEA 的 Kotlin 插件是和语言同步开发的,它是 Kotlin 可用的功能最全面的开发环境。成熟且稳定,提供了 Kotlin 开发所需的全套工具。
Android Studio 可用从 plug-in manager 插件管理器中安装 Kotlin 插件。
3,Java 到 Kotlin 的转换器
刚开始使用 Kotlin 时,如果没有记清楚语法结构,可用先使用 Java 语法编写出相应的代码片段,然后粘贴到 .kt 文件中,转换器会自动地将代码转换成 Kotlin。
在现有的 Java 项目中引入 Kotlin 时,转换器也很好用。若想使用 Kotlin 对原有的 Java 类进行扩展,那么可以先使用转换器将 Java 代码转换成 Kotlin代码。
如何使用
* 复制一段 Java 代码粘贴到 Kotlin 文件中。
* 触发 Convert Java File to Kotlin File 动作来转换整个文件。
复制
粘贴
触发 action 的快捷键: cmd + alt + shift +k
也可以:cmd + shift +a 后再输入框中搜索 Convert Java File to Kotlin File 注意勾选 included disabled actions
五、总结
- Kotlin 是静态语言并支持类型推导,允许维护正确性与性能的同时保持源代码的简洁。
- Kotlin 支持面向对象和函数式两种编程风格,通过头等函数使更高级别的抽象称为可能,通过支持不可变值,简化了测试和多线程开发。
- 在服务端应用程序中可以工作的很好,全面支持所有现存的 Java 框架,为常见的任务提供了新工具,如生成 HTML 和 持久化。
- 在 Android 上它也可以工作,这得益于紧凑的运行时、对 Android API 特殊的编译器支持以及丰富的库,为常见 Android 开发任务提供了 Kotlin 友好的函数。
- 免费且开源,全面支持主流的 IDE 和构建系统。(Gradle,Maven,Ant等)
- Kotlin 是务实的,安全的,简洁的,与 Java 可互操作,意味着它专注于使用已经证明过的解决方案处理常见任务,防止常见的像空指针异常这样的错误,支持紧凑和易读的代码,以及提供与 Java 无限制的集成。