Scala入门

[toc]

## Scala入门

> 1. Spark—新一代内存级大数据计算框架,是大数据的重要内容。Spark就是使用Scala编写的。因此为了更好的学习Spark, 需要掌握Scala这门语言。
> 2. `Scala 是 Scalable Language 的简写`,是一门多范式`(范式/编程方式[面向对象/函数式编程]`)的编程语言
> 3. 联邦理工学院洛桑(EPFL)的Martin Odersky于2001年开始设计Scala。
>
> 4. Spark的兴起,带动Scala语言的发展!

### 1. Scala语言诞生小故事

> 1. `创始人马丁·奥德斯基(Martin Odersky)`是编译器及编程的狂热爱好者,长时间的编程之后,希望发明一语言,能够让写程序这样的基础工作变得高效,简单。所以当接触到JAVA语言后,对JAVA这门便携式,运行在网络,且存在垃圾回收的语言产生了极大的兴趣,所以决定将函数式编程语言的特点融合到JAVA中,由此`发明了两种语言(Pizza & Scala)`。
> - ![image-20200813211557363](assets/image-20200813211557363.png)
> 2. `Pizza和Scala极大地推动了Java编程语言的发展。`[如何理解?]
> - jdk5.0 的泛型,for循环增强, 自动类型转换等,都是从Pizza 引入的新特性。
> - jdk8.0 的类型推断,Lambda表达式就是从scala引入的特性。
> 3. 且现在主流JVM的javac编译器就是马丁·奥德斯基编写出来的。Jdk5.0 Jdk8.0的编译器就是马丁·奥德斯基写的,因此马丁·奥德斯基 一个人的战斗力抵得上一个Java开发团队。

### 2. Scala和 Java以及jvm的关系

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

![image-20200908215140336](assets/image-20200908215140336.png)

~~~scala
.scala 源码

// 1. 能够继续使用java的语法(部分)
System.out.Println("hello") [ok]
HashMap<String,String> hm = new HashMap() [不ok]

//2. sacla特有语法(举例)
val tuple = (1, 20, "hello", 23.9) //元组
val map = Map(("no",10), ("no2", 40)) // map

//3. 增加功能,比如 函数式编程
//(1) 偏函数
// (2) 函数的柯里化
// (3) 高阶函数。。。
// (4) 将函数作为参数传递

//4. 从形式上看,是scala 的类,但是这个类是对java的类/接口进行包装,比如
var arr = new Array[Int](10)
// 表示我定义了一个数组,该数组存放Int, 10个元素
~~~

### 3. Scala 语言的特点

> Scala 是一门以 java 虚拟机(JVM)为运行环境并`将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言。`
>
> 1. Scala 是一门`多范式 (multi-paradigm) 的编程语言`,Scala 支持面向对象和函数式编程。
> 2. Scala 源代码(.scala)会被编译成 Java 字节码(.class),然后运行于 JVM 之上,并可以调用现有的Java 类库,实现两种语言的无缝对接。
> 3. scala 单作为一门语言来看, 非常的简洁高效 (三元运算, ++ , --)
> 4. Scala 在设计时,马丁·奥德斯基 是参考了 Java 的设计思想,可以说 Scala 是源于 java,同时马丁·奥德斯基 也加入了自己的思想,将函数式编程语言的特点融合到 JAVA 中, 因此,对于学习过Java 的同学,只要在学习 Scala 的过程中,`搞清楚 Scala 和 java 相同点和不同点`,就可以快速的掌握Scala 这门语言。、
> 5. 快速有效掌握 Scala 的三点建议
> 1. 学习 scala 法 的特有的语法。
> 2. 区别 scala 和 Java 。
> 3. 如何规范使用 scala。

### 4. Windows下搭建Scala开发环境

> 具体的步骤
>
> 1. 首先把 jdk1.8 安装
> 2. 下载对应的 scala 安装文件 [scala-2.11.8.zip](https://oss-blogs.oss-cn-hangzhou.aliyuncs.com/blogs/hadoop/scala/scala-2.11.8.zip)
> 3. ![image-20200908220333097](assets/image-20200908220333097.png)
> 4. 配置 scala 的环境变量
> 5. ![image-20200908220614364](assets/image-20200908220614364.png)
> 6. 测试一下, 输入 scala 的指令看看效果:
> 7. ![image-20200908220743202](assets/image-20200908220743202.png)

### 5. Linux下搭建Scala开发环境

> 在实际开发中,我们的项目是部署到 linux,因此,我们需要在 Linux 下搭建 scala 的环境。具体的步骤如下:
>
> 1. 下载对应的 scala 的安装软件scala-2.11.8.tgz
>
> 2. 通过远程登录工具,将安装软件上传到对应的Linux 系统/opt/software目录下
>
> 3. `tar -zxvf scala-2.11.8.tgz -C /opt/module` 将安装文件解压,并且移动到
> /opt/module下
>
> 4. 配置环境变量 `vim /etc/profile`
>
> 5. ~~~shell
> export SCALA_HOME=/opt/module/scala-2.11.8
> export PATH=$PATH:$SCALA_HOME/bin
> ~~~
>
> 6. `source /etc/profile`
>
> 7. ![image-20200908221918598](assets/image-20200908221918598.png)

#### Scala的REPL

> 1. 介绍
> - 上面打开的 scala 命令行窗口,我们称之为 REPL,是指:Read->Evaluation->Print->Loop,也称之为`交互式解释器。`
> 2. 说明
> - 在命令行窗口中输入 scala 指令代码时,解释器会读取指令代码(R)并计算对应的值(E),然后将结果打印出来(P),接着循环等待用户输入指令(L)。`从技术上讲,这里其实并不是一个解释器,而是指令代码被快速的编译成 Java 字节码并被 JVM 加载执行。`最终将执行结果输出到命令行中。

### 6. Scala 开发工具的介绍

> idea中Scala 插件安装
>
> ![image-20200908222646249](assets/image-20200908222646249.png)
>
> `scala 的开发的快速入门`
>
> 1. 同Java开发一样先创建一个Maven工程。
>
> 2. 默认下,maven 不支持 scala 的开发,需要引入 scala 框架:`右键项目点击-> add framework support在下图选择 scala`。、
>
> 3. 创建项目的源文件目录:`右键 main 目录->创建一个 diretory -> 写个名字(比如 scala)-> 右键 scala 目录->mark directory -> 选择 source root 即可。`
>
> 4. ![image-20200908223250465](assets/image-20200908223250465.png)
>
> 5. `开发一个 HelloScala.scala 的程序`
>
> ~~~~scala
> package com.atguigu.chapter01
>
> /**
> * @Date 2020/8/13 19:01
> * @Version 10.21
> * @Author DuanChaojie
> */
> object HelloScala {
> def main(args: Array[String]): Unit = {
> println("hello scala!")
> }
> }
> ~~~~

### 7. Scala程序反编译-说明Scala程序的执行流程

> 下面我们说明一下 scala 程序的一执行流程:
>
> 1. object 在底层会`生成两个类 HelloScala , HelloScala$`
> 2. HelloScala 中有个 main 函数,`调用 Hello$ 类的一个静态对象 MODULES$`

#### HelloScala

~~~~scala
package com.atguigu.chapter01;

import scala.reflect.ScalaSignature;

@ScalaSignature(bytes="\006\001%:Q!\001\002\t\002%\t!\002S3mY>\0346-\0317b\025\t\031A!A\005dQ\006\004H/\032:1c)\021QAB\001\bCR<W/[4v\025\0059\021aA2p[\016\001\001C\001\006\f\033\005\021a!\002\007\003\021\003i!A\003%fY2|7kY1mCN\0211B\004\t\003\037Ii\021\001\005\006\002#\005)1oY1mC&\0211\003\005\002\007\003:L(+\0324\t\013UYA\021\001\f\002\rqJg.\033;?)\005I\001\"\002\r\f\t\003I\022\001B7bS:$\"AG\017\021\005=Y\022B\001\017\021\005\021)f.\033;\t\013y9\002\031A\020\002\t\005\024xm\035\t\004\037\001\022\023BA\021\021\005\025\t%O]1z!\t\031cE\004\002\020I%\021Q\005E\001\007!J,G-\0324\n\005\035B#AB*ue&twM\003\002&!\001")
public final class HelloScala{
public static void main(String[] paramArrayOfString){
// HelloScala$.MODULE$. 对象是静态的,通过该对象调用 HelloScala$的 main 函数
HelloScala$.MODULE$.main(paramArrayOfString);
}
}
~~~~

#### HelloScala$

~~~~scala
package com.atguigu.chapter01;

import scala.Predef.;

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

static{
MODULE$ = new HelloScala$();
}
// 可以理解我们在 main 中写的代码在放在 HelloScala$ 的main,在底层执行scala编译器做了一个包装
public void main(String[] args){
Predef..MODULE$.println("hello scala!");
}
private HelloScala$() {
MODULE$ = this;
}

}
~~~~

### 8. Scala 程序开发注意事项(重点)

> 1. ==Scala 源文件以 “.scala" 为扩展名==。
> 2. Scala 程序的执行入口是 main()函数。
> 3. `Scala 语言严格区分大小写。`
> 4. Scala 方法由一条条语句构成,每个语句后不需要分号(Scala 语言会在每行后自动加分号),这也体现出Scala 的简洁性。
> 5. `如果在同一行有多条语句,除了最后一条语句不需要分号,其它语句需要分号。`

### 9. Scala语言输出的三种方式

> 1. 字符串通过+号连接(类似 java)。
> 2. `printf 用法 (类似 C 语言)字符串通过 % 传值。`
> 3. 字符串通过$引用(类似 PHP)。

~~~~scala
/**
* @Date 2020/9/8 23:00
* @Version 10.21
* @Author DuanChaojie
*/
object TestPrint {
def main(args: Array[String]): Unit = {
var name : String = "mm"
var age : Double = 18

// 使用 +
println("hello" + age + name )

// 使用格式化的方式 printf
printf("name=%s day=%f\n", name, age)

//使用$引用的方式,输出变量,类似 php
println(s"第三种方式 name=$name age = ${age + 1}")
}
}
~~~~

### 10. Scala 源码的查看的关联

> 在使用 scala 过程中,为了搞清楚 scala 底层的机制,需要查看源码,下面看看如果关联和查看 Scala的源码包。查看源码, 选择要查看的方法或者类, 输入 `ctrl + b`
>
> 1. 将我们的源码包拷贝到 `scala/lib 文件夹`下[scala-sources-2.12.4](https://oss-blogs.oss-cn-hangzhou.aliyuncs.com/blogs/hadoop/scala/scala-sources-2.12.4.tar)
> 2. 关联即可,选中这个文件夹,进行关联, 最后,可以看到源码。

### 11. 注释

用于注解说明解释程序的文字就是注释,注释提高了代码的阅读性;

`注释是一个程序员必须要具有的良好编程习惯`。将自己的思想通过注释先整理出来,再用代码去体现。

Scala中的类型注释(同Java):

1. 单行注释
2. 多行注释
3. `文档注释`

对一下代码使用scaladoc生成说明文档:

~~~~scala
package com.atguigu.chapter01

/**
* @Date 2020/8/13 19:01
* @Version 10.21
* @Author DuanChaojie
*/
object HelloScala {

def main(args: Array[String]): Unit = {

println("hello scala!")
}

/**
* 文档注释:使用scaladoc命令生成文档说明
*
* @param a 参数1
* @param b 参数2
* @return 返回值
*/
def sum(a: Int, b: Int): Int = {
return a + b
}
}
~~~~

使用以下命令

~~~~cmd
scaladoc -d E:/file/scala HelloScala.scala
~~~~

结果:

![image-20210321160737568](assets/image-20210321160737568.png)

### 12. Scala编码风格

#### 正确的缩进和空白(同Java)

1. 使用一次 tab操作,实现缩进,默认整体向右边移动,时候用shift+tab整体向左移
2. 或者使用ctrl + alt +L来进行格式化
3. 运算符两边习惯性各加一个空格。`比如:2 + 4 * 5。`
4. 一行最长不超过80个字符,超过的请使用换行展示,尽量保持格式优雅

#### Scala官方编程指南

![image-20210321163036676](assets/image-20210321163036676.png)

 

### 13. 本章小结

Scala程序的编写、编译、运行步骤是什么?

1. 编写:就是使用工具,开发scala程序
2. 编译:就是使用scalac命令将.scala文件编译成.class
3. 运行:就是使用scala来将.class文件加载到jvm并运行

能否一步执行?

- 可以直接运行.scala,但是速度慢.cmd ----> `scala xx.scala`

## ☆

posted @ 2022-01-01 21:36  青竹之下  阅读(64)  评论(0编辑  收藏  举报