Scala_针对集合的操作
遍历操作
-
列表的遍历
scala> val list = List(1,2,3,4,5,6) list: List[Int] = List(1, 2, 3, 4, 5, 6) scala> for (elem <- list) println(elem) 1 2 3 4 5 6
-
也可以使用foreach进行遍历:
scala> val list = List(1,2,3,4,5,6)
list: List[Int] = List(1, 2, 3, 4, 5, 6)
scala> list.foreach(elem => println(elem))
1
2
3
4
5
6
scala> list.foreach(println)
1
2
3
4
5
6
scala> list foreach println
1
2
3
4
5
6
-
映射的遍历
-
格式
for ((k , v) <- 映射) 语句块
val university2 = Map("XMU" -> "Xiamen University","THU" -> "Tsinghua University")
scala> for ((k,v) <- university2) printf("Code is : %s and name is : %s\n" , k , v)
Code is : XMU and name is : xiamen university
Code is : THU and name is : Tsinghua University
-
也可以使用foreach来实现对映射的遍历
scala> val university2 = Map("XMU" -> "Xiamen University","THU" -> "Tsinghua University")
university2: scala.collection.immutable.Map[String,String] = Map(XMU -> Xiamen University, THU -> Tsinghua University)
scala> university2 foreach {case(k,v) => println(k+":"+v)}
XMU:Xiamen University
THU:Tsinghua University
-
也可以尝试使用下面形式来遍历
scala> university2 foreach {kv => println(kv._1+":"+kv._2)}
XMU:Xiamen University
THU:Tsinghua University
map操作和flatMap操作
-
map操作是针对集合的典型变换操作,它将某个函数应用到集合中的每个元素,并产生一个结果集合。
scala> val books = List("hadoop","hive","hdfs")
books: List[String] = List(hadoop, hive, hdfs)
scala> books.map(s => s.toUpperCase)
res9: List[String] = List(HADOOP, HIVE, HDFS)
filter操作
-
flatMap是map的一种扩展。在flatMap中,我们会传入一个函数,该函数 对每个输入都会返回一个集合(而不是一个元素),然后,flatMap把生 成的多个集合“拍扁”成为一个集合。
scala> val books = List("hadoop","hive","hdfs")
books: List[String] = List(hadoop, hive, hdfs)
scala> books flatMap(s => s.toList)
res10: List[Char] = List(h, a, d, o, o, p, h, i, v, e, h, d, f, s)
-
上面的flatMap执行时,会把books中的每个元素都调用toList,生成 List[Char],最终,多个Char的集合被“拍扁”成一个集合。
-
遍历一个集合并从中获取满足指定条件的元素组成一个新的集合。Scala中可以 通过filter操作来实现。
-
采用filter操作过滤得到那些学校名称中包含“Tsinghua”的元素
scala> val university = Map("XMU" -> "Xiamen University","THU" -> "Tsinghua University")
university: scala.collection.immutable.Map[String,String] = Map(XMU -> Xiamen University, THU -> Tsinghua University)
scala> val filter = university filter {kv => kv._2 contains "Tsinghua"}
filter: scala.collection.immutable.Map[String,String] = Map(THU -> Tsinghua University)
-
采用filter操作过滤得到那些学校名称中以字母“X”开头的元素:
scala> val filteOfX = university filter {kv => kv._2 startsWith "X"}
filteOfX: scala.collection.immutable.Map[String,String] = Map(XMU -> Xiamen University)
reduce操作
-
使用reduce这种二元操作对集合中的元素进行归约,reduce包含reduceLeft和reduceRight两种操作,前者从集合的头部开始操作,后 者从集合的尾部开始操作。
scala> val list = List(1,2,3,4,5,6)
list: List[Int] = List(1, 2, 3, 4, 5, 6)
scala> list.reduceLeft(_+_)
res11: Int = 21
scala> list.reduceRight(_+_)
res12: Int = 21
-
直接使用reduce,而不用reduceLeft和reduceRight,这时,默认采用的是reduceLeft
fold操作
-
折叠(fold)操作和reduce(归约)操作比较类似。fold操作需要从一个初始的 “种子”值开始,并以该值作为上下文,处理集合中的每个元素。
scala> val list = List(1,2,3,4,5,6)
list: List[Int] = List(1, 2, 3, 4, 5, 6)
scala> list.fold(10)(_*_)
res13: Int = 7200
-
fold有两个变体:foldLeft()和foldRight(),其中,foldLeft(),第一个参数为 累计值,集合遍历的方向是从左到右。foldRight(),第二个参数为累计值, 集合遍历的方向是从右到左。对于fold()自身而言,遍历的顺序是未定义的, 不过,一般都是从左到右遍历。