初识
什么是 Kotlin ?最简单的回答是 Kotlin 是:
Kotlin 由 Jetbrains 开发的一门新的语言。
说起 Jetbrains 不禁让人肃然起敬,在 Java 和 Android 开发领域这家捷克的公司可谓是无人不知、无人不晓,著名的集成开发工具 IntelliJ IDEA 就是有这家公司开发的产品, Android 开发利器 Android Studio 就是在 IDEA 的基础之上设计的。啥?你两者都没接触过,没事,JetBrains 家的产品不仅仅只有这两个, Python 开发常用的 PyChrom ,前端的同学的开发利器 WebStrom 等等,基本上从前端到后端、从数据科学到网页开发、从编程语言到数据库,一些列神奇的工具都是由 JetBrains 开发的,你说这家公司厉不厉害!!!
那么这家公司为什么要开发一门新的语言呢?可以通过 Kotlin 的一些特性来进行了解。
Kotlin 的特性
上图是 Jetbrains 给出的四个为什么选择 Kotlin 的原因。
简洁
首先是简洁,这里可以通过代码之间的对比来观察:
-
Hello World java:
package hello; public class Main { public static void main(String[] args) { System.out.println("Hello World"); } }Kotlin:
package hello fun main() { println("Hello World") }可以明显的观察到 Java 写一个简单的 Hello World 需要 7 行代码,而 Kotlin 只需要 5 行代码,并且输出函数也比 Java 简洁。
-
文件逐行读写 java:
public static List<String> getAllFileLines(String fileName) { if (fileName == null) { throw new NullPointerException("参数不可为空"); } File file = new File(fileName); if (!file.exists()) { throw new IllegalArgumentException("文件路径错误"); } List<String> allFileLines = new ArrayList<>(); try (BufferedReader reader = new BufferedReader(new FileReader(file))){ String line; while ((line = reader.readLine()) != null) { allFileLines.add(line); } } catch (IOException e) { e.printStackTrace(); } return allFileLines; }Kotlin:
fun getAllFileLines(fileName: String): List<String> { var file: File = File(fileName) if (!file.exists()) { throw IllegalArgumentException("文件路径错误") } return file.readLines(); }也许一个简单的 Hello World 并不能看出两者之间的区别,但是通过上述的一个文件读写的例子可以清楚的看到两者之间的对比, Java 用了 22 行,但是使用 Kotlin 的话只用了 7 行。
安全
Java 中最著名的异常就是 java.lang.NullPointException 了,为了防止出现空指针异常的情况有时候不得不在代码中进行防御式编程:
public String getFristStudentNameFromClassRoom(ClassRoom room) {
if (room == null) {
return "教室不存在";
}
List<Students> students = room.getAllStudents();
if (students == null || students.isEmpty()) {
return "这是一个空教室或者所有的学生都不在教室中"
}
return students.get(0);
}
从上述展示的方法中可以看到为了防止空指针异常的情况不得不在代码中添加多个 if 判断,来防止对象为空时程序出错。
但是 Kotlin 已经从语法层面解决了这个问题。 Kotlin 在创建对象时有两种声明:可空、非空,这是从空值角度的分类,这两种类型与其他的类型进行组合,从而在语法层面杜绝空指针异常的问题。
示例:
var str1: String = "this is a str" // 声明一个不可空的字符串,一次必须为字符串赋值,否则编译器会报错。
var str2: String? = null// 声明一个可空的字符串,一次可以暂时赋值为空。
对于上述的示例方法,就可以将其参数设置为不可空类型,这样就会有效的避免空指针异常的出现。
class ClassRoom {
val students: List<String>
constructor(students: List<String>) {
this.students = students
}
}
fun getFristStudentNameFromClassRoom(room: ClassRoom) = if (room.students.isEmpty()) "学生都不在教室中" else room.students[0]
首先,getFristStudentNameFromClassRoom 的参数是一个不可以为空的对象,那么进入函数的 room 一定是不为空的,同时在定义 ClassRoom 的时候就声明了 students 不可为空,因此只需要判断 room.students 中是否存在学生,通过一个三元表达式就可以轻松的完成。
互操作性
学习一门新语言的最大的担忧是什么?
个人认为主要集中在两个方面:
-
价值:
编程语言说白了就是一个工具,既然是工具就必然要有用武之地,能够解决实际的问题,体现语言的价值,这是一门编程语言所必须具有的性质。就拿 Python 来说,其在人工智能、机器学习以及数据分析等领域的突出表现使其成为现在最值得学习的语言之一。当然这是相互作用的,有了以语言为基础的针对某个领域的解决方案后,该领域的相关的问题又会反向的促进语言的发展,有关这点以后有时间在进行详细的讨论。那么 Kotlin 的价值呢?别急接下来就会谈到。
-
学习:
既然是一门新的语言,那么学习的过程就是不可避免的,但是如果在开始阶段就是地狱级的学习难度,相信这门语言是不会有多少人愿意学习的,因此平滑的学习曲线对于一门语言来说也是十分重要的,这并不意味着没有难度,而是指就行关卡制的游戏一样需要循序渐进,逐步的提升难度,应对不同层次的学习者有着不同深度的内容去学习。
那么 Koltin 在这两点上做的如何,首先是第一点价值, Kotlin 现在已经是开发 Android 的首选语言,得到了来自 Google 的大力推广,这个价值应该可以了吧,但是 kotlin 不仅仅于此:
至于第二点,作为一门依托于 JVM 平台的语言, Kotlin 实现了与 Java 百分之百的互操作,这意味着 Java 可以做的事情 Kotlin 都可以做,甚至可以做的更好,同时也可以在同一个项目中采用 Kotlin 与 Java 进行混合编程,充分利用两者的优点。
官方还推出了 Java2Kotlin 转换器,帮助 Java 程序员更加平滑的向 Kotlin 进行转变。
友好的工具
关于这一点别忘了 Kotlin 的老东家 JetBrains ,最优秀的 Java 集成开发环境就是出自这家公司之手,并且 jetBrains 做出了一些列非常优秀的产品,对于自家的亲儿子,你完全不用担心,IDEA 会是你在学习 Kotlin 的过程中的一大助力。