Scala简介
Scala源自Java
Scala构建在JVN之上
Scala与Java兼容、互通
Scala的优势
多范式编程:面向对象编程、函数式编程
表达能力强,代码精简
大数据与Scala
Spqrk采用Scala语言设计
提供的API更加优雅
基于JVM的语言更融入Hadoop生态圈
Scala变量与常量
变量
赋值后可以改变,生命周期中可以被多次赋值
var 变量名称:类型=xxx
常量
赋值后不可变,类似于java中的final变量
val 常量名称:类型=xxx


使用类型别名定义变量
type关键字(不常用)
tyoe 类型别名 = 类型
例:type tt = String
val address:tt = "xxx"

等同于 val address:String = "xxx"
Scala关键字列表
Scala数据类型
Scala与Java有着相同的原始数据类型
| 数据类型 | 描述 |
|---|---|
| Byte | 8位有符号整数。数值区间-128~127 |
| Short | 16位有符号整数。数值区间-32768~32767 |
| Int | 32位有符号整数。数值区间-2147483648~2147483647 |
| Long | 64位有符号整数。 -9223372036854775808 ~ 9223372036854775807 |
| Float | 32位IEEE 754 单精度浮点数 |
| Double | 64位IEEE 754 双精度浮点数 |
| Char | 16位无符号Unicode字符。区间值为U+0000~U+FFFF |
| Boolea | true或false |
| String | 等于java.lang.String |
Scala数据类型层次结构
Any:所有类型的超类(顶级类型)
AnyVal:表示值类型的超类
AnyRef:表示引用类型的超类;对应java.lang.Object
Until:表示无值,类似于Java中的void
Nothing:所有类型的子类
Null:表示null或空引用(null是Null类型的唯一实例)
字符串插值
s插值器:允许将变量引用、表达式直接插入字面字符中
val name = "Aythna"
println(s"Hello,$name") //Hello,Aythna
println(s"1+1 = ${1+1}") //1+1 = 2

f插值器
val height = 1.9d
val neme = "lijia"
Println(f"$name%s is $height%2.2f)

raw插值器
s"a\nb" //将输出换行符
raw"a\nb" //输出原始字符

Scala条件控制
if语句
val x = 10
if(x >0) {
println("x大于0")
}

if…else语句
val x = 10
if(x > 10){
print("x大于10")
} else if{
print("x等于10")
} else {
print("x小于等于10")
}

条件语句返回值
Scala然和表达式都有返回值
val x = 10
val y = if(x == 10) x+1 else x+2 //单行表达式可省略

代码块"{…}"也是表达式,返回值为最后一个表达式结果
val x =10
val y = {
print("我是代码块")
x+1
}

val x =10
val y = {
x+1;Print("我是代码块") //多个表达式使用";"分隔
}

Scala循环控制-1
while循环
var num:int = 0
while (num < 100) {
println(num)
num = num + 1
}

do {
println(num)
num = num +5
} while(num <100)

for循环
val num :int = 10
for(i:int <- 1 to num)
{
println(i*100)
}

for(i <- 1 until 100) {
val y = 2*i
println(y)
}

输出一个等腰三角形
for (i <-1 until 6) {
for (j <- 5 to i by -1) {
print(" ")
}
for (j <- 1 to 2*i-1) {
print("*")
}
println()
}

输出一个空心的等腰三角形
for (i <- 1 until 6) {
for (j <- 6 until i by -1) {
print(" ")
}
for (j <- 1 to 2 * i - 1) {
if (i ==5 || j == 1 || j == i * 2 -1) {
print("*")
}
else {
print(" ")
}
}
println()
}

Scala循环控制-2
中断
import scala.util.control.Breaks._
val num:int = 10
for (i:int <- 1 to num by 2) { //by表示步长为2
if(i >= 5) break
println(i*10)
}

breakable{
for (x <- num to 1 by -1) {
if (x < 3 ) break
println(x)
}
}

for循环过滤
val num = 10
for (i <- 1 to num;if i%2 == 0;if i >5){
println(i*10)
}

Scala循环控制-3
for循环返回值
for循环中的yield会把当前的元素记下来,保存在集合中,循环结束后将返回该集合。也称for推导式
val i = 20
var resValue = for (x<- 1 to i; if x % 2 == 0; if x % 5 == 0) yield x
for (i <- resValue) {
println(i)
}

var resValue = for (x<- 1 to i; if x % 2 == 0; if x % 5 == 0) yield x
println (resValue)

Scala数组
存储固定大小的元素
数组索引从0开始
//数组创建方式一
var array:Array[String] = new Array[String](3)
array(0) = "hello"
array(1) = "world"
array(2) = "scala"
println(array(0))
//数组创建方式二
var array2 = Array("kb09","luoxing","gree","ruiwen")
println(array2(1))
//数组创建方式三:区间数组
var array3 = Array.range(1,10,2)
Array方法
++方法:
合并集合,并返回一个新的数组,新数组包含左右两个集合对象的内容。
val a = Array(1,2,3)
val b = Array(4,5)
val c = a ++ b

++:方法:
合并集合,并返回一个新的数组,新数组包含左右两个集合对象的内容。右边操纵数的类型决定着返回结果的类型
val a = List(1,2)
println(a.getClass.getName)
val b = scala.collection.mutable.LinkedList(3,4)
println(b.getClass.getName)
val c = a ++: b
println(c.getClass.getName)

+:方法:
在数组掐面添加一个元素,并返回新的对象,下面添加一个元素0
val a = List(1,2)
val b = 0 +: a //b中的内容是(0,1,2)

:+方法:
在数组末尾添加一个元素,并返回新对象
val a = List(1,2)
val b = a :+ 0 //b中的内容是(1,2,0)

注意:此处不可将0写在前面,否则会出现如下报错
map方法:
对序列中的元素进行 f 操作
val array = Array(1,2,100)
array.map( x => 2 * x)

注意:对数组进行map操作,不会影响原数组的数据