直到最近,我们都和许多公司一样在基于 Java 或 Scala 的那几种技术(包括 Apache Spark、Storm 和 Kafka)中选一种来构建我们的数据管道。但 Java 是一种非常冗长的语言,因此用 Java 编写这些管道时需要大量样板代码。例如,bean 类这么简单的东西也需要编写多个常规的 getter 和 setter 以及多个构造器和/或构建器。一般来说,哈希和相等方法必须用一种很平常但啰嗦的方式覆盖掉。此外,所有函数参数都需要检查是否为“null”,为此需要多个污染代码的分支运算符。分析哪些函数参数可以或不可以为“null”是非常耗时的(而且很麻烦!)。
处理那些用 Java 编写的管道出来的数据时,往往需要基于管道数据的类型或值来做分支,但 Java“switch”运算符的限制让人们不得不大量使用庞大的“if-then-elseif-...”构造。最后,大多数数据管道使用不可变数据/集合,但 Java 几乎没有对分离可变和不可变构造的内置支持,于是人们只能编写额外的样板代码。
为了解决 Java 在数据管道方面的这些缺点,我们选择了 Kotlin 作为后端开发的替代方案。
为什么是 Kotlin?
我们选择 Kotlin 主要基于如下考虑:
-
Kotlin 中对数据 bean 类的丰富支持让我们无需再编写显式的 getter 和 setter。
-
可选参数和简化的构造器语法让我们无需再编写多个构造器和构建器。
-
“数据类”结构让我们不必再使用简单的样板代码显式覆盖哈希/相等函数。
-
内置的类型系统空指针安全保证不会跳过任何必要的空指针检查,并且我们会收到关于不必要检查的警告,从而大大减少样板代码。我们切换到 Kotlin 后,几乎没再见过可怕的运行时 NPE 异常。
-
用于分离可变数据和不可变数据的强大机制允许我们对并行数据处理进行更简单的推理。
-
通用的“when”运算符允许我们根据数据类型和值编写灵活简洁的分支表达式。
-
与 Java 的无缝集成让我们能继续使用所有