Scala学习笔记(1)
一、Scala简介
-
Scala是一门综合了面向对象和函数式编程概念的静态类型的编程语言。
- Scala的函数式编程概念让它很容易用简单的组件快速构建出有趣的应用。
- 而它的面向对象编程概念让它能够轻松地构造出更大的系统,并不断地适配新的要求。
-
Scala是一门静态语言,运行在标准的Java平台(即JVM)上,可以与所有Java类库无缝协作。
- Scala在与Java的语法比较相似,Scala可以看作在Java的基础上封装了更丰富的操作方法,比Java更具面向对象的特色,同时具备函数式编程语言特点的一门高级语言。
-
学习Scala的原因:
- 学习Scala语言的动机很纯粹,就是为了进一步掌握大数据领域中“大名鼎鼎”的Spark分布式计算框架。Spark是由Scala编写的,阅读Spark源码需要学习Scala。同时编写优质的Spark应用离不开Scala。
-
Scala的特点
(1) Scala是面向对象的
- 在Scala中,它对面向对象的实现是纯的:每个值都是对象,每个操作都是方法的调用。举例来说,在Scala中1+2,实际上是调用Int类里定义的名为+的方法,
这里的+并不是简单的操作符,是属于Int类里的方法。 - 与其它语言相比,在组装对象方面,Scala更为高级。Scala的特质(trait)就是个典型的例子。
(2) Scala是函数式的
-
函数式编程以两大核心理念为指导:
- 第一个理念是函数是一等(first-class)的值。在函数式编程中,函数值的地位跟整数、字符串等是相同的。
- 可以将函数作为参数传递给其它函数,作为返回值返回它们,或者将它们保存在变量里。
- 作为一等值的函数提供了对操作的抽象和创建新的控制结构的便利。
- 第二个核心理念是程序中的操作应该将输入值映射成输出值,而不是当场修改数据。
- 第一个理念是函数是一等(first-class)的值。在函数式编程中,函数值的地位跟整数、字符串等是相同的。
-
Spark编程的核心思想是函数式编程。
- 在Scala中,它对面向对象的实现是纯的:每个值都是对象,每个操作都是方法的调用。举例来说,在Scala中1+2,实际上是调用Int类里定义的名为+的方法,
二、Scala快速入门
1. 环境的配置
(1) Scala环境的配置-csdn链接
(2) 使用Scala解释器
- 配置好Scala环境后,在powershell中输入
scala
,即可使用Scala解释器执行Scala代码,键入:quit
退出Scala解释器。
PS C:\Users\Jackson> scala
Welcome to Scala 2.13.7 (OpenJDK 64-Bit Server VM, Java 16.0.1).
Type in expressions for evaluation. Or try :help.
scala> :quit
PS C:\Users\Jackson>
2.定义变量
(1) Scala的变量分为两种:val
和var
。
val
(value): 值类型,跟Java的final
变量类似,一旦初始化就不能被重新赋值。var
(variable): 变量类型,整个声明周期内,var类型可以被重新赋值。
scala> val hello = "Hello, world!";
val hello: String = Hello, world!
scala>
(2) 声明变量,Scala声明变量的方式与Java有一个显著的区别,Scala支持类型推断,如上例中Scala可以推断出hello
属于String类型的变量。
-
同时,Scala支持显式定义变量,语法形式为
var/val name: type = value
例如,
scala> val hi: String = "Hello, Scala!";
val hi: String = Hello, Scala!
scala>
(3) Scala中,每行末尾的分号不是必须的,此时会以
3. 定义函数
(1) 函数的定义格式
def sum(x: Int, y: Int): Int = {
return x + y;
}
- 函数通过
def
关键字定义,紧接着函数名和参数列表,参数列表中必须定义参数的类型。然后是:
加返回值类型,=
加函数体。 - Scala函数可以省略
return
关键字,这时会以下一行的计算结果作为返回值,例如下面的例子中省略return
关键字:
def max(x: Int, y: Int): Int = {
if(x > y) {
x;
}
else{
y;
}
}
- 简洁风格的函数,Scala支持用更简约的风格定义短函数
def mul(x: Int, y: Int) = { x * y }
scala> def max(x: Int, y: Int) = {if (x>y) x else y}
def max(x: Int, y: Int): Int
scala> max(2, 3)
val res0: Int = 3
(2) 无输入的函数
-
定义无输入的函数
若函数无输入,可以省略
scala> def welcome = println("Hello!");
def welcome: Unit
scala> welcome
Hello!
scala> def hi = "hi";
def hi: String
scala> hi
val res0: String = hi
scala> def hello() = "hello";
def hello(): String
scala> hello()
val res1: String = hello
啊这。。。是的,我也有点惊讶,竟然可以简约到这种地步。
(3) 无返回值的函数,无返回值类型的函数,显示定义时返回值使用Unit
类型。
scala> def welcome(): Unit = {
| println("Hello!")
| }
def welcome(): Unit
scala> welcome()
Hello!
回值使用`Unit`类型。
```scala
scala> def welcome(): Unit = {
| println("Hello!")
| }
def welcome(): Unit
scala> welcome()
Hello!