Scala集合
可变集合、不可变集合
val math = scala.collection.immutable.Map("Alice"->80, "Bob"->90) // 不可变
val chinese = scala.collection.mutable.Map("Alice"->80, "Bob"->90) // 可变
// 获取值
chinese("bob")
chinese.contains("Bob")
chinese.getOrElse("Bob1", -1)
// 修改更新可变集合中的值
chinese("Bob") = 100
chinese += "Jerry"->70
chinese -= "Bob"
// 迭代
chinese.foreach(println)
可变列表、不可变列表
// 不可变列表
val nameList = List("Mary", "Tom"),
val numList = List(1, 2, 3)
val nullList:List[Nothing] = List() // 空列表
val din:List[List[Int]] = List(List(1,2), List(3,4)) // 二维列表
// 操作
nameList.head // 第一个
nameList.tail // 除第一个外的
// 可变列表:可修改值
val myList = mutable.LinkedList(1,2,3)
// 操作
val cur = myList // 定义一个指针
while(cur != Nil){ // 当指针不等于null时
// 对当前值乘以2
cur.elem = cur.elem * 2
// 把指针指向下一个值
cur = cur.next
}
序列
-
Vector:带下标的序列
val v = Vector(1,2,3,4,5,6) v.find(_ > 3) // 返回第一个满足条件的元素 v.updated(2, 100) // 更新下标(从0开始)为2的元素
-
Range:整数序列
Range(0, 5) // Range(0,1,2,3,4) (0 until 5) // 同上 (0 to 4) // 同上 // 操作 ('0' to '9') ++ ('A' to 'Z') // Vector(0,1,...,9,A,B,...,Z) 1 to 5 toList // List(1,2,3,4,5)
集
- set:不重复元素的集合
val s1 = Set(10,2,0,1)
s1 += 0 // 不变
s1 += 100
var weeksDay = LinkedHashSet('星期一', '星期二') // LinkedHashSet
weeksDay + '星期三'
weeksDay.contains("星期二")
set("星期一").subsetOf(weeksDay) // 判断是否为子集
// 交intersect、并union、补diff
var set1 = Set(1,2)
var set2 = Set(2,3)
set1 union set2
var s2 = SortedSet(1,10, 2, 6) // /可排序的set(自动)
模式匹配
- scala中
switch case
语句
var ch1 = '-'
var flag = 0
ch1 match{
case '+' => flag = 1
case '-' => flag = -1
case _ => flag = 0
}
// 匹配数字
var ch2 = '6'
var digit:Int = -1
ch2 match{
case '+' => println('这是一个加号')
case '-' => println('这是一个减号')
case _ if Character.isDigit(ch2) => digit = Character.digit(ch2, 10) // 10表示按照十进制转换
case _ => println('其他类型')
}
// 使用变量
var str3 = 'hello world'
str3(7) match{
case '+' => println('这是一个加号')
case '-' => println('这是一个减号')
case ch => println('这个字符是:' + ch)
}
// 类型的模式
var v4:Any = 100 // Any: 任意类型,类似于java中的Object(所有类的父类)
v4 match{
case x:Int => println("整数")
case s:String => println("字符串")
case _ => print("其他")
}
// 数组和列表
var myArray = Array(1,2,3)
myArray match{
case Array(0) => println('数组中只有0')
case Array(x,y) => println('该数组包含两个元素')
case Array(x,y,z) => println('该数组包含三个元素,和是:' + (x+y+z))
case Array(x, _*) => pritnln('这是一个数组')
} // 列表同
样本类
-
在class前面加关键字
case
-
好处:支持模式匹配,类似
isinstance
;使用样本类来定义DataFrame(表)
的Schema(表的结构)
class Vehicle
case class Car(name:String) extends Vehicle
case class Bike(name:String) extends Vehicle
var car:Vehicle = new Car("汽车")
car match{
case Car(name) => println('这是汽车')
case Bike(name) => print('这是自行车')
case _ => println('其他')
}