一、Scala概述
- 面向对象特征
1.每个值都是对象
2.对象的数据类型和行为由类(Class)和特征(Trait,类似于interface)描述
- 函数式编程
1.每个函数都是一个值
2.支持高阶函数、柯里化(currying)、样例类(case class)及模式匹配……
- Scala是静态类型语言
- 扩展性
二、Scala变量与数据类型
- 变量
var 变量名称:类型 = xxx
//类型可不写,会自动判断
- 常量
val 变量名称:类型 = xxx
类型别名
- type关键字
type 类型别名 = 类型
创建一个对象
// 这是一个对象
object HelloWorld{
// 静态方法专门写在object对象里 unit 为返回值,--返回值为无
// 变量名在前 参数类型在后 冒号隔开
def main(args: Array[String]): Unit = {
println("hello");
}
}
Scala数据类型:
数据类型 | 描述 |
---|---|
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 |
Boolean | true或false |
String | 字符序列 |
数据类型 | 描述 |
---|---|
Any | 所有类型的超类 |
AnyVal | 表示值类型的超类 |
AnyRef | 表示引用类型的超类,对应Object |
Unit | 表示无值,类似void |
Nothing | 所有类型的子类 |
Null | 表示null或空引用 |
Some | 表示有一些东西 |
None | 表示没有一些东西 |
三、Scala循环控制:
- for循环
val num: Int = 10;
for (k: Int <- 1 to 10){
println(i)
}
for (k: Int <- 1 until 10){// 不包含10
println(i)
}
- 中断和继续
import scala.util.control.Breaks._
//._就是.*
val num:Int = 10;
for ( i: Int <- 1 to num by 2 ) { //步长为2
if(i>=5) break;
println( i * 100 );
}
---或者break跳出breakable代码块
breakable{
for (k: Int <- 1 to num by 2){// 步长为2
if (k >= 5)break()
println(k)
}
}
--- continue
for (k: Int <- 1 to num by 2){// 步长为2
breakable{
if (k == 5)break()
println(k)
}
}
//上面2个例子的区别其实就是breakable的范围大小,在循环内,就是continue,在循环外就是break
- for循环过滤
// 满足 所有的if条件才执行
val num:Int = 10;
for ( i: Int <- 1 to num; if i%2==0;if i>5 )
{
println( i * 100 );
}
- for循环返回值
- 循环中的yield会把循环的变量记下来,保存成集合,返回
// 这里返回的是线程安全的vector数组
val arr = for (k: Int <- 1 to 10;if k % 2 == 0) yield k
var num = 0
for(num: Int <- 0 to 6){
println(num + "+" + (6-num) + "=6")
}
四、Scala数组,元祖
Scala数组:
- 存放固定大小的元素
- 数组索引从0开始
// 数组创建方式
var arr: Array[String] = new Array[String](3)
//数组元素访问使用圆括号
a1(0)="Jason"
a1(1)="Marie"
a1(2)="Jimmy"
// 创建方式2
var arr2 = Array("","","")
// 创建方式三:区间数组
var arr3 = Array.range(1,10,2)
Scala元祖:
- 可以包含不同类型的元素
- 最多支持22个元素
- 使用下划线"_"访问元素
// 申明方式一
var tp1 = ("Mike", "123 ABC street", 58)
println(tp1._1)
println(tp1._2)
println(tp1._3)
// 申明方式二
var tp2 = new Tuple3("Mike", "123 ABC street", 58)
// 迭代元组
tp1.productIterator.foreach{ i =>println("Value = " + i )}
//元组声明方式三
def mike = "Mike" -> 5
//输出scala.Tuple2
mike.getClass
//将元组元素依次赋给三个变量
val(name, address, age) = tp1
println(name)
println(address)
println(age)
案例:
var k = "eee" -> 5 -> 7
// 将元组元素依次赋给三个变量
val ((name,addr),stu) = k
Scala集合:
不可变集合
scala.collection.immutable
可变集合
scala.collection.mutable
常用集合如下:
名称 | 可变/不可变 | 示例 |
---|---|---|
Buffer | mutable | val buffer = scala.collection.mutable.ArrayBuffer[Int](10, 20, 30); buffer+=(2,3) |
Array | mutable | val arr=Array(1,2,3) |
List | immutable | val lst=List(1,2,3) |
Map | mutable | val stu= Map(“name” -> “Jason”, “age” -> “18”) |
Set | mutable/immutable | val set=Set(1,2,3) |
Vector | immutable | val v=Vector(1, 3, 5, 7, 11, 13) |
Stack | mutable/immutable | val st=scala.collection.mutable.Stack(1,2,3) //堆栈,先进后出 |
Queue | mutable/immutable | val q=scala.collection.mutable.Queue(1,2,3) //队列,先进先出 |
BitSet | mutable/immutable | val bit=scala.collection.mutable.BitSet(3,2,0) //位集合 |
ListMap | immutable | val map = scala.collection.immutable.ListMap(1->“one”, 2->“two”) |
HashSet | mutable | val set= scala.collection.mutable.HashSet(1,2,3) |
HashMap | mutable | val stu= scala.collection.mutable.HashMap(“name” -> “Jason”, “age” -> “18”) |