基本属性和常用操作

  1. 说明

(1)获取集合长度
(2)获取集合大小
(3)循环遍历
(4)迭代器
(5)生成字符串
(6)是否包含

  1. 案例实操 ```scala object TestList { def main(args: Array[String]): Unit = { val list: List[Int] = List(1, 2, 3, 4, 5, 6, 7)

    //获取集合长度 println(list.length)

    //获取集合大小,等同于length println(list.size)

    //循环遍历 list.foreach(println)

    //迭代器 for (elem <- list.itera tor) { println(elem) }

    //生成字符串 println(list.mkString(“,”))

    //是否包含 println(list.contains(3)) } }

  1. <a name="tCn4b"></a>
  2. # 衍生集合
  3. 1.说明<br />(1)获取集合的头<br />(2)获取集合的尾(不是头的就是尾)<br />(3)集合最后一个数据<br />(4)集合初始数据(不包含最后一个)<br />(5)反转<br />(6)取前(后)n个元素<br />(7)去掉前(后)n个元素<br />(8)并集<br />(9)交集<br />(10)差集<br />(11)拉链<br />(12)滑窗
  4. 2. **案例实操**
  5. ```scala
  6. object TestList {
  7. def main(args: Array[String]): Unit = {
  8. val list1: List[Int] = List(1, 2, 3, 4, 5, 6, 7)
  9. val list2: List[Int] = List(4, 5, 6, 7, 8, 9, 10)
  10. //获取集合的头
  11. println(list1.head)
  12. //获取集合的尾(不是头的就是尾)
  13. println(list1.tail)
  14. //集合最后一个数据
  15. println(list1.last)
  16. //集合初始数据(不包含最后一个)
  17. println(list1.init)
  18. //反转
  19. println(list1.reverse)
  20. //取前(后)n个元素
  21. println(list1.take(3))
  22. println(list1.takeRight(3))
  23. //去掉前(后)n个元素
  24. println(list1.drop(3))
  25. println(list1.dropRight(3))
  26. //并集
  27. println(list1.union(list2))
  28. //交集
  29. println(list1.intersect(list2))
  30. //差集
  31. println(list1.diff(list2))
  32. //拉链 注:如果两个集合的元素个数不相等,那么会将同等数量的数据进行拉链,多余的数据省略不用
  33. println(list1.zip(list2))
  34. //滑窗
  35. list1.sliding(2, 5).foreach(println)
  36. }
  37. }

集合计算初级函数

  1. 说明

(1)求和
(2)求乘积
(3)最大值
(4)最小值
(5)排序

  1. 案例实操 ```scala object TestList { def main(args: Array[String]): Unit = { val list: List[Int] = List(1, 5, -3, 4, 2, -7, 6)

    //求和 println(list.sum)

    //求乘积 println(list.product)

    //最大值 println(list.max)

    //最小值 println(list.min)

    //排序 //按照元素大小排序 println(list.sortBy(x => x))

    //按照元素的绝对值大小排序 println(list.sortBy(x => x.abs))

    //按元素大小升序排序 println(list.sortWith((x, y) => x < y))

    //按元素大小降序排序 println(list.sortWith((x, y) => x > y)) } }

  1. 1sorted<br />对一个集合进行自然排序,通过传递隐式的Ordering<br />(2sortBy<br />对一个属性或多个属性进行排序,通过它的类型<br />(3sortWith<br />基于函数的排序,通过一个comparator函数,实现自定义排序的逻辑
  2. <a name="OWn8y"></a>
  3. # 集合计算高级函数
  4. 1.说明<br />(1)过滤:遍历一个集合并从中获取满足指定条件的元素组成一个新的集合<br />(2)转化/映射(map):将集合中的每一个元素映射到某一个函数<br />(3)扁平化<br />(4)扁平化+映射 注:flatMap相当于先进行map操作,在进行flatten操作,集合中的每个元素的子元素映射到某个函数并返回新集合<br />(5)分组(group) :按照指定的规则对集合的元素进行分组<br />(6)简化(归约)<br />(7)折叠<br />**2.案例实操**
  5. ```scala
  6. object TestList {
  7. def main(args: Array[String]): Unit = {
  8. val list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
  9. val nestedList: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9))
  10. val wordList: List[String] = List("hello world", "hello atguigu", "hello scala")
  11. //过滤
  12. println(list.filter(x => x % 2 == 0))
  13. //转化/映射
  14. println(list.map(x => x + 1))
  15. //扁平化
  16. println(nestedList.flatten)
  17. //扁平化+映射 注:flatMap相当于先进行map操作,在进行flatten操作
  18. println(wordList.flatMap(x => x.split(" ")))
  19. //分组
  20. println(list.groupBy(x => x % 2))
  21. }
  22. }
  1. 输出结果:
  2. List(2, 4, 6, 8)
  3. List(2, 3, 4, 5, 6, 7, 8, 9, 10)
  4. List(1, 2, 3, 4, 5, 6, 7, 8, 9)
  5. List(hello, world, hello, atguigu, hello, scala)
  6. Map(1 -> List(1, 3, 5, 7, 9), 0 -> List(2, 4, 6, 8))
  1. Reduce方法

Reduce简化(归约) :通过指定的逻辑将集合中的数据进行聚合,从而减少数据,最终获取结果。

  1. 案例实操 ```scala object TestReduce { def main(args: Array[String]): Unit = { val list = List(1,2,3,4)

    //将数据两两结合,实现运算规则 val i: Int = list.reduce( (x,y) => x-y ) println(“i = “ + i)

    //从源码的角度,reduce底层调用的其实就是reduceLeft //val i1 = list.reduceLeft((x,y) => x-y)

    //((4-3)-2-1) = -2 val i2 = list.reduceRight((x,y) => x-y) println(i2) } }

  1. <br />**5.Fold方法**<br />Fold折叠:化简的一种特殊情况<br />**6.案例实操**<br />fold基本使用
  2. ```scala
  3. object TestFold {
  4. def main(args: Array[String]): Unit = {
  5. val list = List(1, 2, 3, 4)
  6. //fold方法使用了函数柯里化,存在两个参数列表
  7. //第一个参数列表为:零值(初始值)
  8. //第二个参数列表为:简化规则
  9. //fold底层其实为foldLeft
  10. val i = list.foldLeft(1)((x, y) => x - y)
  11. val i1 = list.foldRight(10)((x, y) => x - y)
  12. println(i)
  13. println(i1)
  14. }
  15. }

两个集合合并

  1. object TestFold {
  2. def main(args: Array[String]): Unit = {
  3. //两个Map的数据合并
  4. val map1 = mutable.Map("a" -> 1, "b" -> 2, "c" -> 3)
  5. val map2 = mutable.Map("a" -> 4, "b" -> 5, "d" -> 6)
  6. val map3: mutable.Map[String, Int] = map2.foldLeft(map1) {
  7. (map, kv) => {
  8. val k = kv._1
  9. val v = kv._2
  10. map(k) = map.getOrElse(k, 0) + v
  11. map
  12. }
  13. }
  14. println(map3)
  15. }
  16. }

普通WordCount例子

1.需求
单词计数:将集合中出现的相同的单词,进行计数,取计数排名前三的结果

2.需求分析
image.png

  1. 案例实操 ```scala object TestWordCount { def main(args: Array[String]): Unit = { //单词计数:将集合中出现的相同的单词,进行计数,取计数排名前三的结果 val stringList = List(“Hello Scala Hbase kafka”, “Hello Scala Hbase”, “Hello Scala”, “Hello”)

    //将每一个字符串转换成一个一个单词 val wordList: List[String] = stringList.flatMap(str => str.split(“ “)) //println(wordList)

    //将相同的单词放置在一起 val wordToWordsMap: Map[String, List[String]] = wordList.groupBy(word => word) //println(wordToWordsMap)

    //对相同的单词进行计数 //(word, list) => (word, count) val wordToCountMap: Map[String, Int] = wordToWordsMap.map(tuple => (tuple._1, tuple._2.size))

    //对计数完成后的结果进行排序(降序) val sortList: List[(String, Int)] = wordToCountMap.toList.sortWith { (left, right) => {

    1. left._2 > right._2

    } }

    //对排序后的结果取前3名 val resultList: List[(String, Int)] = sortList.take(3) println(resultList) } }

  1. <a name="O8ymz"></a>
  2. # 复杂WordCount例子
  3. 1. **方式一**
  4. ```scala
  5. object TestWordCount {
  6. def main(args: Array[String]): Unit = {
  7. //第一种方式(不通用)
  8. val tupleList = List(("Hello Scala Spark World ", 4), ("Hello Scala Spark", 3), ("Hello Scala", 2), ("Hello", 1))
  9. val stringList: List[String] = tupleList.map(t => (t._1 + " ") * t._2)
  10. //val words: List[String] = stringList.flatMap(s=>s.split(" "))
  11. val words: List[String] = stringList.flatMap(_.split(" "))
  12. //在map中,如果传进来什么就返回什么,不要用_省略
  13. val groupMap: Map[String, List[String]] = words.groupBy(word => word)
  14. //val groupMap: Map[String, List[String]] = words.groupBy(_)
  15. //(word, list) => (word, count)
  16. val wordToCount: Map[String, Int] = groupMap.map(t => (t._1, t._2.size))
  17. val wordCountList: List[(String, Int)] = wordToCount.toList.sortWith {
  18. (left, right) => {
  19. left._2 > right._2
  20. }
  21. }.take(3)
  22. //tupleList.map(t=>(t._1 + " ") * t._2).flatMap(_.split(" ")).groupBy(word=>word).map(t=>(t._1, t._2.size))
  23. println(wordCountList)
  24. }
  25. }

2.方式二

  1. object TestWordCount {
  2. def main(args: Array[String]): Unit = {
  3. val tuples = List(("Hello Scala Spark World", 4), ("Hello Scala Spark", 3), ("Hello Scala", 2), ("Hello", 1))
  4. //(Hello,4),(Scala,4),(Spark,4),(World,4)
  5. //(Hello,3),(Scala,3),(Spark,3)
  6. //(Hello,2),(Scala,2)
  7. //(Hello,1)
  8. val wordToCountList: List[(String, Int)] = tuples.flatMap {
  9. t => {
  10. val strings: Array[String] = t._1.split(" ")
  11. strings.map(word => (word, t._2))
  12. }
  13. }
  14. //Hello, List((Hello,4), (Hello,3), (Hello,2), (Hello,1))
  15. //Scala, List((Scala,4), (Scala,3), (Scala,2)
  16. //Spark, List((Spark,4), (Spark,3)
  17. //Word, List((Word,4))
  18. val wordToTupleMap: Map[String, List[(String, Int)]] = wordToCountList.groupBy(t => t._1)
  19. val stringToInts: Map[String, List[Int]] = wordToTupleMap.mapValues {
  20. datas => datas.map(t => t._2)
  21. }
  22. stringToInts
  23. /*
  24. val wordToCountMap: Map[String, List[Int]] = wordToTupleMap.map {
  25. t => {
  26. (t._1, t._2.map(t1 => t1._2))
  27. }
  28. }
  29. val wordToTotalCountMap: Map[String, Int] = wordToCountMap.map(t=>(t._1, t._2.sum))
  30. println(wordToTotalCountMap)
  31. */
  32. }
  33. }