第1章 Scala语言概述

1.1 学习scala的原因

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

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

③ Scala 是 Scalable Language 的简写,是一门多范式(范式/编程方式[面向对象/函数式编程])的编程语言

④ 联邦理工学院洛桑(EPFL)的Martin Odersky于2001年开始设计Scala

⑤ Spark的兴起,带动Scala语言的发展!

1.2 scala诞生小故事

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

Pizza和Scala极大地推动了Java编程语言的发展。[如何理解?]

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

jdk8.0 的类型推断,Lambda表达式就是从scala引入的特性。

且现在主流JVM的javac编译器就是马丁·奥德斯基编写出来的。Jdk5.0 Jdk8.0的编译器就是马丁·奥德斯基写的,因此马丁·奥德斯基 一个人的战斗力抵得上一个Java开发团队。

1.3 Scala 和 Java 以及 jvm 的关系

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

建议:如果没有任何Java基础的同学,先学Java,至少要学习JavaSE,再学习Scala。

1.4 Scala语言的特点

① Scala是一门以java虚拟机(JVM)为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言。

② Scala 是一门多范式 (multi-paradigm) 的编程语言,Scala支持面向对象和函数式编程

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

④ scala 单作为一门语言来看, 非常的简洁高效 (三元运算, ++ , --)

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

⑥ 快速有效掌握Scala的建议 [1. 学习scala 特有的语法 2. 搞清楚 scala 和java 区别 3. 如何规范的使用scala]

1.5 Windows下搭建Scala开发环境

① Scala需要Java运行时库,安装Scala需要首先安装JVM虚拟机并配置好

② 在http://www.scala-lang.org/ 下载安装包

提示: 根据不同的操作系统选择不同的安装包,下载完成后,将安装包解压到安装目录

③ 配置SCALA_HOME=D:\develop\scala\scala-2.11.8

④ 将Scala安装目录下的bin目录加入到PATH环境变量在PATH变量中添加:%SCALA_HOME%\bin

⑤ 在终端中输入“scala”命令打开scala解释器

Scala的REPL

介绍:

上面打开的scala命令行窗口,我们称之为REPL,是指:Read->Evaluation->Print->Loop,也称之为交互式解释器。

说明:

在命令行窗口中输入scala指令代码时,解释器会读取指令代码(R)并计算对应的值(E),然后将结果打印出来(P),接着循环等待用户输入指令(L)。从技术上讲,这里其实并不是一个解释器,而是指令代码被快速的编译成Java字节码并被JVM加载执行。最终将执行结果输出到命令行中

1.6 Linux下搭建Scala开发环境

① 在http://www.scala-lang.org/ 下载安装包

②上传至服务器,准备安装

③ 解压到指定目录

1
tar -xvzf scala-2.11.8.tgz && mv scala-2.11.8 /opt/module/

④ vim /etc/profile 编辑配置文件,配置环境变量,保存并退出

⑤ 执行 source /etc/profile 使环境变量生效

⑥ 执行 scala -version 正常返回版本信息,则Scala环境配置成功

1.7 使用idea开发scala项目

1.7.1 安装插件

① 打开IDEA工具,如图:点击Configure

或者: 文件->settings->pulgins 这里也能找到插件安装的位置

② 点击Plugins

③ 搜索scala插件进行安装

④ 安装完成,重新启动idea, Scala的插件安装成功了!

1.7.2 创建项目

① 创建maven项目

② 项目添加scala的framework

创建的maven项目默认是不支持scala的,需要为项目添加scala的framework,如图:

在这里选择Scala后,在右边的Use library中配置你的安装目录即可,最后点击OK。

说明: 第一次引入scala framework时,需要去配置一下,就是选择一下scala的安装目录,这时,会导入 scala 的 sdk, 以后再创建时,就不用再配置了

③ 在项目的目录结构中,创建scala文件夹,并标记为source

④ 以上配置都完成后,就可以在scala上点击右键创建scala class了

⑤ 编写代码如下

⑥ 右键 run 运行即可

1.8 HelloWorld程序解析

1.8.1代码解析

1
2
3
4
5
object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("helloworld!")
  }
}

1.object 表示一个伴生对象,可以简单理解为就是一个对象

2.HelloWorld就是对象的名字,它底层真正对应的类名是HelloWorld$.class

对象是HelloWorld$.class类型的一个静态对象MODULE$

3.def scala中定义方法的关键字

4.main 方法名,程序执行的入口

5.args: Array[String] 方法的参数列表,与java不同的是参数名在前类型在后

6.Array[String] 表示数组类型

7.Unit 表示该方法的返回值为空(等同于java中的void)

8.println("helloworld!") 打印语句

1.8.2运行原理

HelloWorld.scala源码文件通过编译后得到的其实是两个.java文件

利用反编译工具会看到如下内容:

HelloWorld$.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.liquid.bigdata;

import scala.Predef$;

public final class HelloWorld$ {
 
  public static final MODULE$;

  static {
    new ();
  }

  public void main(String[] args) {
    Predef$.MODULE$.println("helloworld!");
  }
 
  private HelloWorld$() {
    MODULE$ = this;
  }

}

HelloWorld.class

1
2
3
4
5
6
7
8
9
10
package com.liquid.bigdata;

import scala.reflect.ScalaSignature;

@ScalaSignature (bytes = "...")
public final class HelloWorld {
  public static void main (String[] paramArrayOfString) {
    HelloWorld$.MODULE$.main(paramArrayOfString);
  }
}

scala在运行时的流程如下:

(1)先从HelloWorld的main开始执行,即执行

1
2
3
public static void main (String[] paramArrayOfString) {
    HelloWorld$.MODULE$.main(paramArrayOfString);
}

(2)然后调用HelloWorld$的方法 HelloWorld$.MODULE$.main,即执行

1
2
3
public void main(String[] args) {
    Predef$.MODULE$.println("helloworld!");
}