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/ 下载安装包
②上传至服务器,准备安装
③ 解压到指定目录
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代码解析
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源码文件通过编译后得到的其实是两个.class文件
利用反编译工具会看到如下内容:
HelloWorld$.class
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
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开始执行,即执行
public static void main (String[] paramArrayOfString) {
HelloWorld$.MODULE$.main(paramArrayOfString);
}
(2)然后调用HelloWorld$的方法 HelloWorld$.MODULE$.main,即执行
public void main(String[] args) {
Predef$.MODULE$.println("helloworld!");
}
1.8.2 Java模拟scala的执行流程
public class HelloWorld {
public static void main(String[] args) {
HelloWorld$.MODULE$.main(args);
}
}
final class HelloWorld$ {
public static final HelloWorld$ MODULE$;
static {
MODULE$ = new HelloWorld$();
}
public void main(String[] args) {
System.out.println("hello world");
}
}
1.8.3 Scala 程序开发注意事项
① Scala 源文件以 “.scala" 为扩展名。
② Scala 程序的执行入口是 main() 函数。
③ Scala 语言严格区分大小写。
④ Scala 方法由一条条语句构成,每个语句后不需要分号(Scala 语言会在每行后自动加分号
),这也体现出 Scala 的简洁性。
⑤ 如果在同一行有多条语句,除了最后一条语句不需要分号,其它语句需要分号。
1.9 Scala 语言转义字符
\t :一个制表位,实现对齐的功能
\n :换行符
\\ :一个\
\" :一个"
\r :一个回车
1.10 Scala 语言输出的三种方式
① 字符串通过+号连接(类似java)。
② printf 用法(类似C语言)字符串通过 % 传值。
③ 字符串通过 $ 引用(类似PHP)。
object PrintDemo {
def main(args: Array[String]): Unit = {
val str1: String = "hello"
val str2: String = "world"
// 连接打印
println(str1 + str2)
val name: String = "tom"
val age: Int = 10
val sal: Float = 10.67f
val height: Double = 180.75
// 格式化输出
printf("名字=%s 年龄=%d 薪水=%.2f 身高=%.3f", name, age, sal, height)
// scala 支持使用 $ 输出内容
println(s"个人信息如下1:\n 名字$name\n 年龄$age\n 薪水$sal\n")
// 如果字符串中出现了类似 ${age + 10} ,则表示 {} 是一个表达式
println(s"个人信息如下2:\n 名字${name}\n 年龄${age + 10}\n 薪水${sal}\n")
}
}
1.11 注释
① 单行注释:格式:// 注释文字
② 多行注释:格式: /* 注释文字 */
③ 文档注释:注释内容可以被工具 scaladoc 所解析,生成一套以网页文件形式体现的该程序的说明文档。
scala中的注释和java没什么区别