文章目录
02.scala语言简介
-
scala是spark的语言基础,为了给spark学习打基础。
-
早期,scala刚出现的时候,并没有怎么引起重视,随着Spark和Kafka这样基于scala的大数据框架的兴起,scala逐步进入大数据开发者的眼帘。scala的主要优势是它的表达性。
-
flink是java开发的。以后会统一天下。但是flink为了迎合spark的用户,开放了scala的开发接口。
-
scala是运行在
JVM
上的多范式编程语言,同时支持面向对象和面向函数编程。 -
定义java类和scala类
03.scala开发环境安装
- java环境编译执行流程
- scala编译执行流程
- 安装jdk、sdk、idea scala插件
04.scala解释器
- 后续我们会使用scala解释器来学习scala基本语法,scala解释器像Linux命令一样,执行一条代码,马上就可以让我们看到执行结果,用来测试比较方便。
- 要启动scala解释器,只需要以下几步:
- 按住
windows键 + r
- 输入
scala
即可 - 在scala命令提示窗口中执行
:quit
,即可退出解释器
- 按住
println("123")
println("111")
println("222")
println("333")
- :paste 粘贴模式 ctrl + d 结束
hello world
创建类
定义变量
数据类型
数据结构
方法
多个类的使用
线程
05.变量
java
final String name = tom
name = tom2
int age = 11
scala
val sex:String = “male”
sex = “female”
var sex:String = “male”
sex = “female”
lazy var sex:String = “male”
在scala中,可以使用val
或者var
来定义变量,语法格式如下:
val/var 变量标识:变量类型 = 初始值
其中
val
定义的是不可重新赋值的变量var
定义的是可重新赋值的变量- scala可以自动根据变量的值来自动推断变量的类型,这样编写代码更加简洁。
- 惰性赋值
06.字符串
scala提供多种定义字符串的方式,将来我们可以根据需要来选择最方便的定义方式。
- 使用双引号
- 使用插值表达式
- 使用三引号
07.数据类型与操作符
位运算符
&
5 & 3
0101
0011
---------------&
0001 1 总结:同时为真,才为真。
|
0101
0011
---------------|
0111 7 总结:有真即真。
^
0101
0011
---------------^
0110 6 总结:相同为假,不同为真。
<<
8 << 2 = 32
1000 00
7 << 2 = 28 总结:7 * 2^2
>>
6 >> 1 = 3
5 >> 2 = 1 总结:5 / 2^2
基础类型 | 类型说明 |
---|---|
Byte | 8位带符号整数 |
Short | 16位带符号整数 |
Int | 32位带符号整数 |
Long | 64位带符号整数 |
Char | 16位无符号Unicode字符 |
String | Char类型的序列(字符串) |
Float | 32位单精度浮点数 |
Double | 64位双精度浮点数 |
Boolean | true或false |
- scala类型层次架构
08.条件表达式
-
if(a > 10){
-
}else{}
-
条件表达式就是if表达式 val name = “swk” val name = if() “swk” else “zbj”
-
示例
定义一个变量sex,再定义一个result变量,如果sex等于"male",result等于1,否则result等于0
参考代码
scala> val sex = "male" sex: String = male scala> val result = if(sex == "male") 1 else 0 result: Int = 1
-
scala中,使用{}表示一个块表达式
-
和if表达式一样,块表达式也是有值的
-
值就是最后一个表达式的值
scala> val a = {
| println("1 + 1")
| 1 + 1
| }
09.循环
- 在scala中,所有的值都是对象(值类型,引用类型)
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
for(i <- 1 to 9;j <- 1 to i){
| print(j+"*"+i+"="+i*j+"\t")
| if(i == j){
| println()}
| }
- for
for(i <- 表达式/数组/集合) {
// 表达式
}
- for推导式、可以使用for推导式生成一个新的集合(一组数据)
// for推导式:for表达式中以yield开始,该for表达式会构建出一个集合
val v = for(i <- 1 to 10) yield i * 10
- while
scala> var i = 1
i: Int = 1
scala> while(i <= 10) {
| println(i)
| i = i+1
| }
10.break和continue
- break
示例
使用for表达式打印1-100的数字,如果数字到达50,退出for表达式
参考代码
// 导入scala.util.control包下的Break
import scala.util.control.Breaks._
breakable{
for(i <- 1 to 100) {
if(i >= 50) break()
else println(i)
}
}
- continue
示例
打印1-100的数字,使用for表达式来遍历,如果数字能整除10,不打印
// 导入scala.util.control包下的Break
import scala.util.control.Breaks._
for(i <- 1 to 100 ) {
breakable{
if(i % 10 == 0) break()
else println(i)
}
}
11.方法定义
语法
def methodName (参数名:参数类型, 参数名:参数类型) : [return type] = {
// 方法体:一系列的代码
}
- scala定义方法可以省略返回值,由scala自动推断返回值类型。这样方法定义后更加简洁。
示例
定义递归方法(求阶乘)
参考代码
scala> def m2(x:Int) = {
| if(x<=1) 1
| else m2(x-1) * x
| }
<console>:13: error: recursive method m2 needs result type
else m2(x-1) * x
12.方法参数
- 默认参数
- 在定义方法时可以给参数定义一个默认值。
示例
- 定义一个计算两个值相加的方法,这两个值默认为0
- 调用该方法,不传任何参数
参考代码
// x,y带有默认值为0
def add(x:Int = 0, y:Int = 0) = x + y
add()
-
带名参数
- 在调用方法时,可以指定参数的名称来进行调用。
-
示例
- 定义一个计算两个值相加的方法,这两个值默认为0
- 调用该方法,只设置第一个参数的值
参考代码
def add(x:Int = 0, y:Int = 0) = x + y add(x=1)
-
变长参数
-
语法格式:
def 方法名(参数名:参数类型*):返回值类型 = { 方法体 }
参考代码
scala> def add(num:Int*) = num.sum add: (num: Int*)Int scala> add(1,2,3,4,5) res1: Int = 15
13.方法调用方式
在scala中,有以下几种方法调用方式,
- 后缀调用法
- 中缀调用法
- 花括号调用法
- 无括号调用法
后缀调用法
这种方法与Java没有区别。
语法
对象名.方法名(参数)
中缀调用法
语法
对象名 方法名 参数
例如:1 to 10
花括号调用法
语法
Math.abs{
// 表达式1
// 表达式2
}
无括号调用法
- 如果方法没有参数,可以省略方法名后面的括号
参考代码
def m3()=println("hello")
m3
14.函数
语法
val 函数变量名 = (参数名:参数类型, 参数名:参数类型....) => 函数体
示例
- 定义一个两个数值相加的函数
- 调用该函数
参考代码
scala> val add = (x:Int, y:Int) => x + y
add: (Int, Int) => Int = <function2>
scala> add(1,2)
res3: Int = 3
- 方法和函数的区别
- 方法是隶属于类或者对象的,在运行时,它是加载到JVM的方法区中
- 可以将函数对象赋值给一个变量,在运行时,它是加载到JVM的堆内存中
- 函数是一个对象,继承自FunctionN,函数对象有apply,curried,toString,tupled这些方法。方法则没有