1. Scala语言概述
1.1 计算机的起源
阿隆佐邱奇设计了演算的系统,形式系统。
阿兰图灵提出图灵机。
冯诺依曼是计算机体系结构的奠基者。1945年提出计算机体系结构。
1.2 编程范式
命令式语言完全根植于冯诺依曼体系结构的。
函数式编程(或者称为泛函编程)将计算机中的计算看成是数学上的函数计算。源于演算。
Scala也融合了函数式编程的风格。
在大数据时代,我们要实现的是并行计算。命令式编程中,线程之间会共享一些变量,为了保持变量的一致性,通常采用加锁机制,但是一旦某个线程加锁,其它的线程就只能等待,这不能充分发挥多核CPU的优势。
而在函数式编程中,一般是一旦设定了变量的值,后面就不允许再更改。由于不存在值的更改,也就不需要并发控制,因而可以进行并行处理。
Erlang语言在电信行业使用频度非常高。
由于Spark是由Scala编写,因而Spark可以充分利用多核CPU的多线程并发能力。
1.3 Scala简介
Scala语言是一门类似Java的多范式语言,类似于Java,并且其本身就是在Java基础上发展起来的。
Scala之父是Martin Odersky,javac就是他开发的。
Scala是一种混合式的编程范式,既包含面向对象编程风格,也包含函数式编程风格。
1.3.1 Scala的特点
(1)兼容现有的所有Java程序
Scala运行在Java虚拟机(JVM)之上的,可以兼容现有的所有Java程序。即,可以将Java类import到Scala中,并通过类调用其方法。
正因为Scala和Java完全兼容,因而Scala能和Hadoop系统能够实现融合。
(2)Scala是一门纯粹的面向对象语言
也就是Scala中的每一个值都是一个对象。例如下图,在执行“3+5”时,其实是执行“3”的对象方法“.()”,并传入的对象“5”。
(3)也是一门函数式语言
1.4 Scala的安装
大数据的大部分编程是在Linux环境下,这里只介绍在Linux系统下的安装。
1.4.1 这里介绍2种安装JVM方法
(1)使用OpenJDK直接进行安装
注意Spark、Scala和Java的版本。例如,(Spark 2.1.0) + (Scala 2.11.8) + (Java 7以上)。
(a) JDK安装
# JDK的安装
sudo apt-get install openjdk-7-jre openjdk-7-jdk
(b)环境变量的配置
vim ~/.bashrc
将第一行改为实际安装路径。
(c)使配置立即生效
source ~/.bashrc #使变量设置生效
(2) 使用命令安装default-jdk
(a)命令安装
sudo apt-get install default-jre default-jdk
(b)配置环境变量JAVA_HOME
步骤同上
(c)使配置生效
同上
(3) 检测Java环境是否安装成功
java -version
1.4.2 Scala的安装
首先到(https://sdkman.io/install)按照步骤安装skdman。
然后,执行
sdk install scala
这样,我们就可以启动scala解释器。
Scala通常是交互式的执行环境,称为REPL(Read-Eval-Print-Loop)。
1.5 HelloWorld
可以通过不同的方式编写HelloWorld程序。
1.5.1 交互式方法(Scala解释器)
(1)直接在交互式环境中编写代码
退出交互式Scala解释器:
(2)运行脚本文件
假设事先已经建好了代码文件,“Test.scala”
在Scala REPL中执行如下命令运行改代码文件:
:load 后面是全路径
然后显示“Loading...”
然后是代码文件中的输出内容。
1.5.2 通过编译打包的方式运行Scala程序
如果代码文件中定义了对象,就需要通过编译去执行。
例如,下图定义了单例对象
-什么是单例对象?(后面的内容会讲的更详细)
-定义在单例对象中所有的方法都是静态方法。就是不需要实例化就可以执行。
使用scalac命令进行编译(编译的结果为Java字节码)
使用scala命令运行字节码文件
-classpath:指scalac生成的“.class”文件位置,即告诉scala到什么位置找“.class”文件。
上行命令表示“.class”就在当前目录下。
由于Scala与Java是完全兼容的,因此scalac生成的字节码文件可以完全由Java执行。
使用java命令运行字节码文件:
“:”是把两个路径组合在一起。
由于字节码是由scalac生成的,此时又是由java执行字节码文件,因此需要依赖scala的包才能得到正确的结果。
2. Scala基础知识
2.1 基本数据类型和变量
2.1.1 基本数据类型
Scala的基本数据类型和Java的基本数据类型类似。
以上的这些数据类型都是类,例如
但是String是一个特例,它是直接使用Java里面的String,也就是使用
java.lang.String
来表示字符串。
2.1.2 字面量(Literal)
下面给出一些例子,
2.1.3 操作符
操作符的优先级:
2.1.4 操作符定义成方法
每一个操作符其实是调用了其方法,例如
2.1.5 富包装类
例如,下图的Int类中只有基本的操作,如果我们要进行“max”的操作,Int对象就会被隐式地、自动地转换成富包装类对象。
2.1.6 变量
Scala里包含两种变量(不可变和可变变量)
两种变量的声明:
Scala有类型自动推断机制,所以不需要每次声明变量时,显式声明其类型。
下面的例子是对不可变变量进行重新赋值,系统报错!
另外,在同一个执行环境中,可以不断地重复使用同一个变量名,系统会记住最后一次定义的那个变量类型。
2.2 输入输出
(下文待续。。。)
函数的字面量
2.3 控制结构
2.4 数据结构
3. 面向对象编程基础