Scala 其实是一门非常小众的语言,现在码农们对它的关注度以及重视度越来越高,其原因主要在于 Spark 的出现,Spark 的出现是大数据领域继 Hadoop 之后又一革命性的技术突破,当然现在主流的大数据处理框架还有 Flink 。虽然 Spark 现在也提供了 Java、Python、R 等接口,但 Scala 作为 Spark 的原生语言,受到的关注自然更高一点,毕竟是亲儿子嘛。
我学习 Scala 的理由很简单,就是为了能更好地使用 Spark,不知道有多少雀友学习的理由是和我一样的。同时,作为《Spark深度实践》的参编作者,我也建议大家在使用 Spark 时尽可能地选择 Scala 语言,因为真的很好用啊。当然关于 PySpark 和 SparkR ,后面也会整理出相关的文档教程出来。
1. Scala 优点
- 兼容性:Scala 架设在 Java 平台上,可以与 Java 库无缝交互。
- 融合多门语言的优点:完美将面向对象和函数式编程风格进行了融合
- 简洁:语法极简,极少的代码量就可以完成相应的功能,其他语言可能需要至少 2 倍以上的代码量
Scala 最吸引的还是它极简的代码,来看一下下面,个人觉得 Scala 整体代码结构更清晰,也更简单。保守估计,标准 Scala 程度使用 Java 实现的话,代码量将会翻一倍。
class MyClass {private int index;private String name;public MyClass(int index, String name) {this.index = index;this.name = name;}}
实现上述 Java MyClass 类,Scala 只需要一行就可以搞定了。
class MyClass(index: Int, name: String)
再来看一个 Scala、Java、Python、R 在定义关系映射时的例子:
var captial = Map("US" -> "Washington","France" -> "Pairs",)captial += {"Japan" -> "Tokyo"}println(captial("France")
import java.util.HashMap;import java.util.Map;Map<String, String> captical = new HashMap<>();captical.put("US", "Washington");captical.put("France", "Pairs");captical.put("Japan", "Japan");System.out.println(captical);
captical = {"US": "Washington","France": "Pairs",}# 或者使用 captical["Japan"] = "Tokyo"captical.update({"Japan": "Japan"})captical
captical <- list("US" = "Washington","France" = "Pairs")captical$Japan <- "Tokyo"captical
:::info 📝 知识扩展
- 除了 Java 之外,很多语言都实现了关系映射,例如 Python 和 R。值得一提的是,R 里面是没有直接定义关系映射的数据类型的,但 R 所提供的
list方法具备定义关系映射的功能。 - Scala 中除了 Map 外,还有
HashMap、TreeMap、SynchronizedMap:::
- 高层抽象:Scala 的定位是高级语言,它支持匿名变量,并且它极大地简化了
for循环的使用。我们来看一个例子,判断一个字符串是否包含大小字符。
```java boolean nameHasUpperCase = false; for (int i = 0; i < name.length(); ++i) { if (Character.isUpperCase(name.charAt(i))) {// _ 为字符参量val nameHasUpperCase = name.exists(_.isUpperCase)
} }nameHasUpperCase = true;break;
// 通过实现接口的方式,来实现上述抽象功能 interface CharacterProperty { boolean hasProperty(char ch); }
exists(name, new CharacterProperty() { public boolean hasProperty(char ch) { return Character.isUpperCase(ch); } });
> 💡 这里思考一下,由于这是判断是否的问题,Scala 的实现方式采用遍历的方式,并没有像 Java 那样采用中断形式。- [x] **高级的静态类型化**:Scala 允许使用 Java 内嵌类型:泛型、交集、抽象类,静态类型具备可检验属性、安全的重构、文档等优点,并且 Scala 非常精通类型推断```scalaval x: HashMap[Int, String] = new HashMap[Int, String]()/* 在定义变量类型时,没有必要进行两次定义,Scala 的类型推断可以让程序让程序很轻松地知道变量所属类型,可以采用以下两种方式进行改写*/val x = new HashMap[Int, String]()val x: Map[Int, String] = new HashMap()
