为何Spark选择了Scala
初学Scala,给我的感觉就是一堆语法糖以及最近名声大噪的函数式编程。
可是λ表达式Java也有,map / reduce java也有,速度上java也会比scala快,心想一定是自己见识不够,无法领悟。今看一文章,有所感悟:《为什么选择Scala,他在大数据处理方面有何优势》
在这篇文章中有几个核心观点用于支持spark选择scala的原因:
观点1:应用开发的效率很大程度上依靠类库。框架开发者要考虑spark要融入大Hadoop大家族需要一个JVM语言,能够开发出优雅的API(文章说Java api 不优雅,代码量大),静态编译(直接pass掉groovy)(值得注意的是,在大数据和人工智能上作者还是偏向于使用R/Python/Matlab),这样以来能进行选择的似乎只有scala。
观点2:函数式编程更适合于MR以及大数据模型
观点3:scala是一门可扩展的语言(这一点,目前还没有体会到其真正的含义)
观点4:类型系统支持 (这么一说,又勾起自己对scala类型系统的思考与研究的兴趣)
如果说 Java 是一种类型安全的语言, 那么毫无疑问, Scala 的类型更加安全, 从某种程度上说, Scala 的类型是图灵完备的, 而 Java 不是. 我的一位好朋友在这方面研究的比较深( http://hongjiang.info/scala/ ), 而我对与 Scala 的类型系统的理解, 也还是皮毛.
正是以上这两点大优势, 造成了 Scala 比 Java 更加安全, 同时又具备灵活性, 想象力.
观点5:其他语言层面上的优势 (语法特性吧)
在 Java 中, 你是否有时很想继承多个 AbstractClass 呢? 对不起, Java 只支持单继承
在 Scala 中, 你可以进行 mixin (Java 8 也开始引入 default method 了呢)
在 Java 中, 想要一个 singleton ? 要么在 static block 中做, 要么利用 Enum 的单例特性完成, 或者其他更纠结的方法.
在 Scala 中, 只要声明为 object, 即为单例.
在 Java 中, 想要延迟加载一个单例? double check吧
在 Scala 中, 只要在 object 中将变量修饰为 lazy 即可
在 Java 中, 想要对集合进行一些操作? 使用一层一层的 for 循环吧
在 Scala 中, 使用 collection 的一些集合操作, 即可获得如写SQL般的享受.
在 Java 中, 在并发中想对Future进行回调? 对不起, Future 不是 Listenable (无法支持回调), 除非你使用额外的工具(如 guava, spring)
在 Scala 中, 本来就主张异步编程, future 和 promise 的配合让人非常愉快.
在 Java 中, 要透明扩展一个第三方库的类怎么办? 包装, 再加一层.
在 Scala 中, 有强大的 implicit 机制让你更优雅的做到这一点, 同时还能保证类型安全(比起 Ruby 的 monkey patch, 要安全得多)
Scala 的表达力很强, 相同功能的代码, 用 Java 和 Scala 的行数不可同日而语.
这些单单是语言层面上的优势, 除此之外, Scala 还能无缝结合 Java
原文链接:https://blog.csdn.net/chenbinkria/article/details/81433683