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 实现的话,代码量将会翻一倍。

  1. class MyClass {
  2. private int index;
  3. private String name;
  4. public MyClass(int index, String name) {
  5. this.index = index;
  6. this.name = name;
  7. }
  8. }

实现上述 Java MyClass 类,Scala 只需要一行就可以搞定了。

  1. class MyClass(index: Int, name: String)

再来看一个 Scala、Java、Python、R 在定义关系映射时的例子:

  1. var captial = Map(
  2. "US" -> "Washington",
  3. "France" -> "Pairs",
  4. )
  5. captial += {"Japan" -> "Tokyo"}
  6. println(captial("France")
  1. import java.util.HashMap;
  2. import java.util.Map;
  3. Map<String, String> captical = new HashMap<>();
  4. captical.put("US", "Washington");
  5. captical.put("France", "Pairs");
  6. captical.put("Japan", "Japan");
  7. System.out.println(captical);
  1. captical = {
  2. "US": "Washington",
  3. "France": "Pairs",
  4. }
  5. # 或者使用 captical["Japan"] = "Tokyo"
  6. captical.update({"Japan": "Japan"})
  7. captical
  1. captical <- list(
  2. "US" = "Washington",
  3. "France" = "Pairs"
  4. )
  5. captical$Japan <- "Tokyo"
  6. captical

:::info 📝 知识扩展

  1. 除了 Java 之外,很多语言都实现了关系映射,例如 Python 和 R。值得一提的是,R 里面是没有直接定义关系映射的数据类型的,但 R 所提供的 list 方法具备定义关系映射的功能。
  2. Scala 中除了 Map 外,还有 HashMapTreeMapSynchronizedMap :::
  • 高层抽象:Scala 的定位是高级语言,它支持匿名变量,并且它极大地简化了 for 循环的使用。我们来看一个例子,判断一个字符串是否包含大小字符。
    1. // _ 为字符参量
    2. val nameHasUpperCase = name.exists(_.isUpperCase)
    ```java boolean nameHasUpperCase = false; for (int i = 0; i < name.length(); ++i) { if (Character.isUpperCase(name.charAt(i))) {
    1. nameHasUpperCase = true;
    2. break;
    } }

// 通过实现接口的方式,来实现上述抽象功能 interface CharacterProperty { boolean hasProperty(char ch); }

exists(name, new CharacterProperty() { public boolean hasProperty(char ch) { return Character.isUpperCase(ch); } });

  1. > 💡 这里思考一下,由于这是判断是否的问题,Scala 的实现方式采用遍历的方式,并没有像 Java 那样采用中断形式。
  2. - [x] **高级的静态类型化**:Scala 允许使用 Java 内嵌类型:泛型、交集、抽象类,静态类型具备可检验属性、安全的重构、文档等优点,并且 Scala 非常精通类型推断
  3. ```scala
  4. val x: HashMap[Int, String] = new HashMap[Int, String]()
  5. /* 在定义变量类型时,没有必要进行两次定义,Scala 的类型推断可以让程序
  6. 让程序很轻松地知道变量所属类型,可以采用以下两种方式进行改写
  7. */
  8. val x = new HashMap[Int, String]()
  9. val x: Map[Int, String] = new HashMap()

1.1 面向对象式编程

1.2 函数式编程