第 1 章 Scala 入门

1.1 概述

1.1.1 为什么学习 Scala

  • 1)Spark—新一代内存级大数据计算框架,是大数据的重要内容。

  • 2)Spark就是使用Scala编写的。因此为了更好的学习Spark, 需要掌握Scala这门语言。

  • 3)Spark的兴起,带动Scala语言的发展。(大数据内行业重器 -Spark)

1.1.2 Scala 发展历史

联邦理工学院的马丁·奥德斯基(Martin Odersky)于2001年开始设计Scala。

马丁·奥德斯基是编译器及编程的狂热爱好者,长时间的编程之后,希望发明一种 语言,能够让写程序这样的基础工作变得高效,简单。所以当接触到JAVA语言后,对 JAVA这门便携式,运行在网络,且存在垃圾回收的语言产生了极大的兴趣,所以决定 将函数式编程语言的特点融合到JAVA中,由此发明了两种语言(Pizza & Scala)。

Pizza和Scala极大地推动了Java编程语言的发展。

  • JDK5.0 的泛型增 强for循环自动类型转换等,都是从Pizza引入的新特性。

  • JDK8.0 的类型推断、Lambda表达式就是从Scala引入的特性。

JDK5.0和JDK8.0的编辑器就是马丁·奥德斯基写的,因此马丁·奥德斯基一个人的 战斗力抵得上一个Java开发团队。

1.1.3 Scala 和 Java 关系

一般来说,学 Scala 的人,都会 Java,而 Scala 是基于 Java 的,因此我们需要将 Scala 和 Java 以及 JVM 之间的关系搞清楚,否则学习 Scala 你会蒙圈。

Scala和Java及JVM关系图

image-20210324191147699

1.1.4 Scala 语言特点

Scala 语言特点

Scala是一门以Java虚拟机(JVM)为运行环境并将面向对象函数式编程的最佳特性结合在一起的 静态类型编程语言(静态语言需要提前编译的如:Java、c、c++等,动态语言如:js)。

  • Scala是一门多范式的编程语言,Scala支持面向对象和函数式编程。(多范式,就是多种编程方 法的意思。有面向过程、面向对象、泛型、函数式四种程序设计方法。)

  • Scala源代码(.scala)会被编译成Java字节码(.class),然后运行于JVM之上,并可以调用现有 的Java类库,实现两种语言的无缝对接。

  • Scala单作为一门语言来看,非常的简洁高效

  • Scala在设计时,马丁·奥德斯基是参考了Java的设计思想,可以说Scala是源于Java,同时马丁·奥 德斯基也加入了自己的思想,将函数式编程语言的特点融合到JAVA中, 因此,对于学习过Java的同学, 只要在学习Scala的过程中,搞清楚Scala和Java相同点和不同点,就可以快速的掌握Scala这门语言。

1.2 Scala 环境搭建

安装步骤

官方下载:https://www.scala-lang.org/download/

(1)首先确保 JDK1.8 安装成功

(2)下载对应的 Scala 安装文件 scala-2.12.11.zip

(3)解压 scala-2.12.11.zip,我这里解压到 D:\software

(4)配置 Scala 的环境变量

image-20210324193147246

注意 1:解压路径不能有任何中文路径,最好不要有空格。

注意 2:环境变量要大写 SCALA_HOME

测试

需求:计算两数 a 和 b 的和。

image-20210324193348483

反编译分析

1
2
3
4
5
object HelloScala{
def main(args: Array[String]): Unit = {
println("hello scala")
}
}

执行scalac编译源文件会得到两个文件

  • HelloScala$.class

  • HelloScala.class

image-20210324193855878

将生成的字节码反编译

1
2
3
4
5
6
7
8
9
10
import scala.reflect.ScalaSignature;

@ScalaSignature(bytes="\006\001%:Q\001B\003\t\002!1QAC\003\t\002-AQAE\001\005\002MAQ\001F\001\005\002U\t!\002S3mY>\0346-\0317b\025\0051\021a\002\037f[B$\030PP\002\001!\tI\021!D\001\006\005)AU\r\0347p'\016\fG.Y\n\003\0031\001\"!\004\t\016\0039Q\021aD\001\006g\016\fG.Y\005\003#9\021a!\0218z%\0264\027A\002\037j]&$h\bF\001\t\003\021i\027-\0338\025\005YI\002CA\007\030\023\tAbB\001\003V]&$\b\"\002\016\004\001\004Y\022\001B1sON\0042!\004\017\037\023\tibBA\003BeJ\f\027\020\005\002 M9\021\001\005\n\t\003C9i\021A\t\006\003G\035\ta\001\020:p_Rt\024BA\023\017\003\031\001&/\0323fM&\021q\005\013\002\007'R\024\030N\\4\013\005\025r\001")
public final class HelloScala
{
public static void main(String[] paramArrayOfString)
{
HelloScala..MODULE$.main(paramArrayOfString);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 明显看出来是一个单例 HelloScala$
import scala.Predef.;

public final class HelloScala$
{
public static MODULE$; //静态属性

static
{
new ();// 静态代码块new一个HelloScala$
}

public void main(String[] args)
{
Predef..MODULE$.println("hello scala");
}
private HelloScala$() { MODULE$ = this; } // 私有化构造

}

去掉java中static关键字 使用object关键字声明单例对象,这样的对象在scala中被叫做伴生对象,因为对象不能真正意义上的单独出现,还是属于哪个类的。 通过反编译 可以看出 HelloScala HelloScala$ 的一个对象。

Java中hi定义一个类去执行里面的静态方法,让人感觉这不足够的面向对象, 让人不感觉不是一切皆对象,怎么是直接类调用静态方法。Scala中就去掉了static关键字,但是要实现对应的功能,全局就一份,那就用一个单例来做。

HelloScala是伴生对象的伴生类 HelloScala$ 为伴生对象的所属类

image-20210324211454283

1.3 HelloWorld案例

默认情况下 IDEA 不支持 Scala 的开发,需要安装 Scala 插件。

1. 新建一个Maven项目

image-20210324213035383

2. 添加scala插件

image-20210324213201608

3. 建立一个scala的根目录(直接在Java下开发也行)

image-20210324213453104

4. 添加框架支持

image-20210324213605704

image-20210324213736434

5. 在 scala 包下,创建包 com.zzxx.chapter01 包名和 Hello 类名,

  • 右键点击 scala 目录->New->Package->输入 com.zzxx.chapter01->点击 OK。

  • 右键点击 com.zzxx.chapter01->New->Scala Class->Kind 项选择 Object->Name 项输入 Hello。

image-20210324214612272

6. 编写输出 Hello Scala 案例

在类中输入 main,然后回车可以快速生成 main 方法;

在 main 方法中输入 println(“hello scala”)

image-20210324215010015

说明:Java 中部分代码也是可以在 Scala 中运行。

对HelloWorld程序进行说明

  • main方法名

    • 小括号表示参数列表
    • 参数声明方式:java→类型 参数名
    • scala->参数名: 类型
  • public修饰符: scala中没有public关键字,如果不声明访问权限,那么就是公共的。

  • static修饰符: scala中没有静态语法,所以没有static关键字。

  • void关键字:表示返回值,但是不遵循面向对象语法,所以scala中没有,但是有Unit类型,表示没有返回值scala中:方法名(参数列表):返回值类型

  • scala中声明方法必须采用关键字def声明

  • scala中方法实观赋值给方法声明,所以中间需要等号连接

  • Scala是一个完全面向对象的语言,所以没有静态语法,为了能调用静态语法(模仿静态语法),

    • 采用伴生对系单例的方式调用方法

1.4 关联 Scala 源码

在使用 Scala 过程中,为了搞清楚 Scala 底层的机制,需要查看源码,下面看看如何关 联和查看 Scala 的源码包。

1)查看源码

例如查看 Array 源码。按住 ctrl 键->点击 Array->右上角出现 Attach Soures…

image-20210324223703998

2)关联源码

1、将我们的源码包 scala-sources-2.12.11.tar.gz 拷贝到 D:\Tools\scala-2.12.11\lib 文件夹 下,并解压为 scala-sources-2.12.11 文件夹

2、点击 Attach Sources…->选择 D:\Tools\scala-2.12.11\lib\scala-sources-2.12.11,这个文件夹,就可以看到源码了

image-20210324224310202

官方编程指南

1)在线查看:https://www.scala-lang.org/

2)离线查看:解压 scala-docs-2.11.8.zip,可以获得 Scala 的 API 操作。

image-20210324223845650