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 非常精通类型推断
```scala
val x: HashMap[Int, String] = new HashMap[Int, String]()
/* 在定义变量类型时,没有必要进行两次定义,Scala 的类型推断可以让程序
让程序很轻松地知道变量所属类型,可以采用以下两种方式进行改写
*/
val x = new HashMap[Int, String]()
val x: Map[Int, String] = new HashMap()