本博客简要讲述了Scala集合的核心操作,是学习Scala必须掌握的基础知识,后续更新Scala的高级语法糖。
2. 集合操作
2.1 List集合
2.1.1 声明一个List集合
scala> val list = List(1,2,3,4,5,6)
list: List[Int] = List(1, 2, 3, 4, 5, 6)
2.1.2 List集合的map操作
操作一: 基本操作
scala> val newList = list.map((x:Int)=>2*x)
newList: List[Int] = List(2, 4, 6, 8, 10, 12)
操作二: 由于List中只有一种元素类型,所以可以省略参数类型
scala> val newList = list.map((x)=>2*x)
newList: List[Int] = List(2, 4, 6, 8, 10, 12)
操作三: 如果只有一个参数,则可以省略参数列表的括号
scala> val newList = list.map(x=>2*x)
newList: List[Int] = List(2, 4, 6, 8, 10, 12)
操作四: 使用占位符表示集合中的元素
scala> val newList = list.map(_*2)
newList: List[Int] = List(2, 4, 6, 8, 10, 12)
2.2 Set集合
scala> val ss = Set(1,2,1)
ss: scala.collection.immutable.Set[Int] = Set(1, 2)
注意: Set集合中不存在重复元素,如果有重复元素则会去掉重复的元素
2.3 Tuple集合
2.3.1 创建Tuple集合
操作1: 创建普通Tuple集合
scala> val hostPort=("localhost","8080")
hostPort: (String, String) = (localhost,8080)
scala> hostPort._1
res6: String = localhost
scala> hostPort._2
res7: String = 8080
注意: Tuple集合中可以放置不同类型的元素;
Tuple集合中的元素访问是从下标1开始访问的;
操作2: 创建2个元素的Tuple集合
scala> "a"->"b"
res8: (String, String) = (a,b)
2.3.2 赋值操作
scala> val tuple = (1,2,3,4,"lubin","spark")
tuple: (Int, Int, Int, Int, String, String) = (1,2,3,4,lubin,spark)
scala> val (first,second,third,fourth,fifth,six)=tuple
first: Int = 1
second: Int = 2
third: Int = 3
fourth: Int = 4
fifth: String = lubin
six: String = spark
注意: 上面tuple的长度必须与接收的元组长度一致,否则报错
scala> val (f1,f2,_,_,_,_)=tuple
f1: Int = 1
f2: Int = 2
注意: 上述占位符”_”表示此位置不需要赋值
scala> "Spark Hadoop".partition(_.isUpper)
res10: (String, String) = (SH,park adoop)
注意: partition函数的参数为一个布尔表达式函数,判断字符串中的字符是否为大写;最后将大写字符组合为一个字符串,非大写字符组合为一个字符串形成元组
2.4 Map集合
2.4.1 创建Map集合
操作1: 创建immutable类型Map
scala> Map("a"->"b","lubin"->"10000")
res11: scala.collection.immutable.Map[String,String] = Map(a -> b, lubin -> 10000)
注意: 创建Map使用的可变参数方式;
创建的 Map默认是immutable类型
操作2: 创建mutable类型Map
scala> val map = scala.collection.mutable.Map("apple"->7,"spark"->8)
map: scala.collection.mutable.Map[String,Int] = Map(spark -> 8, apple -> 7)
2.5 Option类型
Option类型表示一个值是可选的(有值或无值)
Option[T] 是一个类型为 T 的可选值的容器: 如果值存在,Option[T] 就是一个 Some[T] ,如果不存在, Option[T] 就是对象 None 。
scala> val map = Map("key1"->"spark","key2"->100)
map: scala.collection.immutable.Map[String,Any] = Map(key1 -> spark, key2 -> 100
)
scala> val value1 = map.get("key1")
value1: Option[Any] = Some(spark)
scala> val value2 = map.get("key2")
value2: Option[Any] = Some(100)
scala> val value3 = map.get("key3")
value3: Option[Any] = None
使用getOrElse() 函数来获取Option中的值,如果有值,则返回实际值,没有则返回默认值
scala> value2.getOrElse(0)
res14: Any = 100
scala> value3.getOrElse(0)
res15: Any = 0
2.6 filter操作
scala> val list = List(1,2,3,4,5)
list: List[Int] = List(1, 2, 3, 4, 5)
scala> list.filter(x=>x%2==0)
res16: List[Int] = List(2, 4)
注意: filter函数接受一个boolean表达式,作用为过滤出满足布尔条件的值组成的集合;顺序与原来一致;
2.7 zip操作
scala> val a=List(1,2,3)
a: List[Int] = List(1, 2, 3)
scala> val b = List(4,5,6)
b: List[Int] = List(4, 5, 6)
scala> a zip b
res17: List[(Int, Int)] = List((1,4), (2,5), (3,6))
注意: a zip b 可以写成a.zip(b)
scala> val a=List(1,2,3)
a: List[Int] = List(1, 2, 3)
scala> val b = List(1,2,3,4)
b: List[Int] = List(1, 2, 3, 4)
scala> a zip b
res18: List[(Int, Int)] = List((1,1), (2,2), (3,3))
scala> val array = Array("[","-","]")
array: Array[String] = Array([, -, ])
scala> val nums = Array(2,5,6)
nums: Array[Int] = Array(2, 5, 6)
scala> val pairs = array.zip(nums)
pairs: Array[(String, Int)] = Array(([,2), (-,5), (],6))
scala> for((x,y)<-pairs) print(x*y)
[[-----]]]]]]
注意: 字符串与数字相乘,结果:字符串复制了该数字的倍数
2.8 partition操作
scala> val list = List(1,2,3,4,5,6,7,8,9,10)
list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> list.partition(_%2==0)
res21: (List[Int], List[Int]) = (List(2, 4, 6, 8, 10),List(1, 3, 5, 7, 9))
注意: partition函数的参数为一个布尔表达式,返回值为两个集合,第一个集合为满足布尔表达式的值组成的集合,第二个集合为不满足布尔表达式的值组成的集合;两个集合中元素的顺序与原来保持一致。
2.9 flatten操作
scala> val list = List(List("a","b"),List("cc","dd"))
list: List[List[String]] = List(List(a, b), List(cc, dd))
scala> list.flatten
res22: List[String] = List(a, b, cc, dd)
2.10 flatMap操作
map和flatten操作的结合,先进行map操作,然后进行flatten操作
scala> val list = List(List("a","b"),List("cc","dd"))
list: List[List[String]] = List(List(a, b), List(cc, dd))
scala> list.flatMap(x=>x.map(_*2))
res24: List[String] = List(aa, bb, cccc, dddd)