1、Scala特性
Scala特性:
1、表达能力强,代码简洁
2、兼容java,可以访问java类库,能操作:mysql、freemarker、redis、AcviveMQ
2、基础语法
2.1变量定义
var/val 变量名:数据类型 = 赋值
val a:Int = 0
var s:String = "hello"
val和var关键字对比
:
- val修饰的变量定义后不能再修改值,但可以被复写
- var修饰的变量可以随意修改值
- scala中被final修饰的变量,既不可以修改值,也不可以被复写
var a = 0
val s = "hello"
说明:定义变量类型可以被省略,scala解释器可以根据赋值自定识别出便变量类型
2.2惰性赋值
lazy val a:Int = 0
lazy val s:String = "hello"
说明:定时变量时前方增加lazy关键字,即为惰性赋值,使用这种赋值方式的好处是:变量只有被使用的时候,才会加载到jvm
使用场景:大数据分析中,会使用比较庞大的sql,但有的时候这段sql不需要立刻记载到内存中,这个使用可以使用惰性赋值,以此来减少内存的开销
3.字符串定义
定义字符串的三种方式
1、双引号定义
val s = "hello"
2、插值表达值
val age = 20 val name = "西门" val sex = "男"
val info = s"age=${age},name=${name},sex=${sex}"
输出结果:info = age=20,name=西门,sex=男
3、三引号定义
val sql = """ select * from aaa where ..."""
解析:使用三引号方式定义字符串,三引号中间的所有内容都会当成字符串处理
注意:三引号中不能再次出现三引号,一旦出现,解析器认为字符串定义结束,不可使用转义字符对其进行转义
4.数据类型
4.1基础数据类型
基础类型 | 类型说明 |
---|---|
Byte | 8位带符号整数 |
Short | 16位带符号整数 |
Int | 32位带符号整数 |
Long | 64位带符号整数 |
Char | 16位无符号Unicode字符 |
String | Char类型的序列(字符串) |
Float | 32位单精度浮点数 |
Double | 64位双精度浮点数 |
Boolean | true或false |
所有类型首字母大写
整形使用Int,不使用Integer
4.2 运算符
算数运算符:+ - * / %
逻辑运算符:&& || !
关系运算符:< > <= >= !=
位运算符:& || ^ >> <<
着重说明:
==运算符:scala中的'=='运算符比较智能,在进行比较前会先对对象进行判空操作,如果对象不为空,
会比较对象的值是否相等
比较对象内存地址使用‘.eq’方法
4.3 scala层次结构
说明:
1、Any为Scala的顶级父类,类似java的Object
2、AnyVal为基本数据类型(数值类型)的父类
3、AnyRef为引用数据类型的父类
4、Unit类型代表方法返回值类型,相当于java的void
5、Null是所有引用数据类型的子类,数值类型没有这个子类
6、Nothing是最底层子类,平常不会用到,程序运行抛出异常时返回该类型
5.基础语法
5.1 if表达式
和java语法基本相同,不同的是scala的if表达式有返回值
示例:
val i = 10
val a = if(i == 10) 1 else 2
5.2 块表达式
用{}括住的代码称为块表达式,scala中的块表达式有返回值,块表达式最后一行输出的结果为返回值
例:val a = {
println("hello")
1 + 2
}
返回值结果为3
5.3 循环
for循环
for(i <- 0 to 10) {
println(i)
}
注:0 to 10返回0-10范围内数字组成的数组
例:打印如图所以内容
*****
*****
*****
for(i <- 0 to 3; j <- 0 to 5) {
print("*")
if(j == 5)
println()
}
守卫:
for(i <- 0 to 10 if 1%3 == 0)
print(i)
输出结果:369
for推导式:
例子:生成一个10,20,30...100组成的
val list = fo(i <- 0 to 10) yield i * 10
while循环:
打印1-10的数字
val i = 0;
while(i <= 10) {
println(i)
i = i + 1
}
5.4 break和cotinue
scala中没有这两个关键字,想要实现类似功能,需要导入其它的包
import scala.util.control.Breaks._
例[break]:使用for表达式打印1-100的数字,如果数字到达50,退出for表达式
breakable {
for(i <- 0 to 100) {
println(i)
if(i >= 50)
break()
}
}
例[continue]:打印1-100的数字,使用for表达式来遍历,如果数字能整除10,不打印
for(i <- 0 to 100) {
breakable{
if(i % 10 == 0)
break()
else
print(i)
}
}
5.5 方法
方法定义格式:def 方法名(参数名:参数类型,参数名:参数类型):返回值类型 = {
方法体...
}
说明:1、通常可以省略返回值类型,scala解释器会自动识别
2、方法内部有递归调用的时候,返回值不能省略
3、不用return返回数据,块表达式默认最后一行返回
4、可以给参数设置默认值,但不能省略参数类型
例:定义一个方法,实现两个整形数值相加,返回相加后的结果
def add(x:Int, y:Int):Int = {
x + y
}
val a = add(1, 2)
例:定义递归方法(求阶乘)
def mutiply(x:Int):Int = {
if(x <= 1) 1
else mutiply(x - 1) * x
}
变长参数:
def add(x:Int*) = {
x.sum
}
add(1,2,3,4,5)
val arr = Array(1,2,3,4,5)
add(arr:_*)
方法的四种调用方式:
1、后缀调用
.方法名()
2、中缀调用
Math abs(-1)
3、花括号调用[只适用于只有一个参数的方法]
Math.abs{ -1 }
4、无括号调用法[只适用于没有参数的方法]
def output = println("hello")