第一章.集合

1.集合基本属性

  1. package com.atguigu.chapter07
  2. //集合基本属性
  3. object $12_CollectionFields {
  4. def main(args: Array[String]): Unit = {
  5. val list = List(1,3,2,8,10,12)
  6. //是否包含某个元素
  7. println(list.contains(100))
  8. //获取集合长度
  9. println(list.length)
  10. println(list.size)
  11. //将集合所有元素拼接成字符串
  12. println(list.mkString("#"))
  13. //判断集合是否为空
  14. println(list.isEmpty)
  15. //集合转迭代器
  16. val it = list.toIterator
  17. for (elem <- it) {
  18. println(s"elem=${elem}")
  19. }
  20. println(("-----------------"))
  21. for (elem <- it) {
  22. println(s"elem1=${elem}")
  23. }
  24. println(("-------------"))
  25. val it2 = list.toIterable
  26. for (elem <- it2) {
  27. println(s"elem=${elem}")
  28. }
  29. println("---------------")
  30. for (elem <- it2) {
  31. println(s"elem1=${elem}")
  32. }
  33. }
  34. }

2.衍生集合

  1. package com.atguigu.chapter07
  2. //衍生集合
  3. object $13_Collection {
  4. def main(args: Array[String]): Unit = {
  5. val list = List(1,2,3,1,4,5,6,7,8,9)
  6. //去重
  7. val list2 = list.distinct
  8. println(list2)
  9. //获取除开前N个元素的其他所有元素
  10. println(list.drop(3))
  11. //获取第一个元素
  12. println(list.head)
  13. //获取最后一个元素
  14. println(list.last)
  15. //获取除开最后一个元素的其他所有元素
  16. println(list.init)
  17. //获取除开第一个元素的其他所有元素
  18. println(list.tail)
  19. //反转
  20. println(list.reverse)
  21. //获取指定角标范围的所有元素
  22. println(list.slice(2, 5))
  23. //滑窗
  24. //sliding(size[,step=1])
  25. //size: 窗口长度
  26. //step: 滑动长度
  27. println(list.sliding(2).toList)
  28. //获取前n个元素
  29. println(list.take(3))
  30. //获取后n个元素
  31. println(list.takeRight(3))
  32. //交集:两个集合共同的元素
  33. val list3 = List(1,2,3,4,5)
  34. val list4 = List(4,5,6,7,8)
  35. val list5 = list3.intersect(list4)
  36. println(list5)
  37. //差集: A差B的结果就是A中除开交集的所有元素
  38. val list6 = list3.diff(list4)
  39. println(list6)
  40. //并集: 两个集合的所有元素
  41. val list7 = list3.union(list4)
  42. println(list7)
  43. //拉链
  44. val list8 = List("zhangsan","wangwu","lilei","hanmeimei")
  45. val list9 = List(20,30,40)
  46. val list10 = list8.zip(list9)
  47. println(list10)
  48. //反拉链
  49. println(list10.unzip)
  50. //将元素与角标拉链
  51. println(list8.zipWithIndex)
  52. }
  53. }

3.集合初级计算函数

  1. package com.atguigu.chapter07
  2. //集合初级计算函数
  3. object $14_CollectionLowFunction {
  4. def main(args: Array[String]): Unit = {
  5. val list = List(1,4,2,7,10,8,6)
  6. //获取最大值
  7. println(list.max)
  8. //获取最小值
  9. println(list.min)
  10. //根据指定字段获取最大值
  11. /*
  12. * maxBy(func:集合元素类型=>B)
  13. maxBy后续是根据函数的返回值来获取最大的元素
  14. * maxBy里面的函数是针对集合每个元素操作
  15. */
  16. val list2 = List(("zhangsan",20,4500),("wangwu",45,10000),("lisi",18,2000),("wangwu",30,7000))
  17. //println(list2.max)
  18. val func = (x:(String,Int,Int))=>x._3
  19. println(list2.maxBy(func))
  20. //直接传递函数值
  21. println(list2.maxBy((x: (String, Int, Int)) => x._3))
  22. //省略函数类型
  23. println(list2.maxBy((x) => x._3))
  24. //函数的参数在函数体中只是使用了一次,可以用_代替
  25. println(list2.maxBy(_._3))
  26. /**
  27. * 根据指定字段获取最小值
  28. * minBy(func:集合元素类型=>B)
  29. * minBy后续也是根据函数的返回值获取最小元素
  30. * minBy里面的函数是针对集合每个元素操作
  31. */
  32. println(list2.minBy(_._2))
  33. //求和
  34. println(list.sum)
  35. //排序
  36. //sorted:直接根据元素本身排序,默认升序
  37. //升序
  38. println(list.sorted)
  39. //降序
  40. println(list.sorted.reverse)
  41. println(list2.sorted)
  42. /**
  43. * sortBy(func:集合元素类型=>B) 根据指定字段排序,默认升序
  44. * sortBy是根据函数的返回值排序
  45. * sortBy里面的函数也是针对集合每个元素操作
  46. */
  47. val ordering = new Ordering[Int]{
  48. override def compare(x: Int, y: Int): Int = {
  49. if(x>y) -1
  50. else if(x==y) 0
  51. else 1
  52. }
  53. }
  54. println(list2.sortBy(x => x._2)(ordering))
  55. println(list.sortBy(x => x))
  56. //sortWith:自定义排序规则
  57. //sortWith(func:(集合元素类型,集合元素类型)=>Boolean)
  58. //升序
  59. println(list.sortWith((x: Int, y: Int) => x < y))
  60. //降序
  61. println(list.sortWith((x: Int, y: Int) => x > y))
  62. }
  63. }

4.集合高级计算函数

  1. package com.atguigu.chapter07
  2. //集合高级计算函数
  3. object $15_CollectionHightFunction {
  4. def main(args: Array[String]): Unit = {
  5. /**
  6. * map(func:集合元素类型=>B):映射[一对一]
  7. * val B = A.Map(..)此时B集合的元素个数=A集合的元素个数
  8. * map里面的函数是针对集合每个元素操作,集合有多少元素,函数就会调用多少次
  9. * map就相当于for循环的yield表达式
  10. * map的使用场景:一对一[map主要用于数据类型/值的转换]
  11. */
  12. val list = List("spark","hello","hadoop","java")
  13. val func = (x:String)=>{
  14. println(s"element=${x}")
  15. x.length
  16. }
  17. val list2 = list.map(func)
  18. println(list2)
  19. /**
  20. * flatten:压平
  21. * flatten针对集合嵌套集合的场景
  22. * flatten是将第二层集合压掉
  23. * flatten的应用场景: 一对多
  24. */
  25. val list3:List[List[Int]]=List(
  26. List(1,2,3),
  27. List(4,5,6),
  28. List(7,8)
  29. )
  30. val list4 = list3.flatten
  31. println(list4)
  32. val list5:List[List[List[Int]]]=List(
  33. List(
  34. List(1,2),
  35. List(3,4)
  36. ),
  37. List(
  38. List(5,6),
  39. List(7)
  40. )
  41. )
  42. val list6 = list5.flatten
  43. println(list6)
  44. val list7 = List("hello","spark")
  45. println(list7.flatten)
  46. /**
  47. * flatMap(func:集合元素类型=>集合) = map + flatten
  48. * flatMap里面的函数也是针对集合每个元素操作
  49. * flatMap的应用场景:一对多
  50. * flatMap与flatten的区别:
  51. * a.flatMap是先转换数据之后再压平
  52. * b.flatten没有数据转换工作,直接压平
  53. *
  54. * val B = A.flatMap 此时B集合的元素个数>=A集合的元素个数
  55. */
  56. val list8 = List("hello spark hello hadoop","hello python python hadoop","hadoop flume spark")
  57. val list9 = list8.map(x=>x.split(" "))
  58. val list10 = list9.flatten
  59. println(list10)
  60. /**
  61. * foreach(func:集合元素类型=>B):Unit
  62. * foreach中的函数是针对每个元素操作
  63. * foreach与map的区别:map会生成新的集合,foreach没有返回值
  64. */
  65. list8.foreach(x=>println(x))
  66. list8.foreach(println(_))
  67. list8.foreach(println)
  68. /**
  69. * filter(func:集合元素类型=>Boolean):根据指定条件过滤
  70. * filter保留的是函数返回值为true的数据
  71. * filter里面的函数针对每个元素操作
  72. */
  73. val list11 = List(10,2,5,4,3,7,9)
  74. val list12 = list11.filter(x=>x%2==0)
  75. println(list12)
  76. /**
  77. * groupBy(func:集合元素类型=>K):根据指定字段分组
  78. * groupBy里面的函数是针对集合每个元素操作
  79. * groupBy后续是根据函数的返回值进行分组
  80. * groupBy的结果是Map,map的key是函数返回值,map的value是原集合中key对应的所有元素
  81. */
  82. val list13 = List(("zhangsan","man","shenzhen"),("lisi","woman","beijing"),("wangwu","man","beijing"))
  83. val map = list13.groupBy(x=>x._2)
  84. println(map)
  85. /**
  86. * 聚合
  87. * reduce(func:(集合元素类型,集合元素类型)=>集合元素类型):从左往右聚合
  88. * reduce中的函数的第一个参数代表上一次的聚合结果,第二个参数是当前待聚合的元素
  89. * reduce中的函数的第一个参数在第一次聚合的时候,初始值= 集合第一个元素
  90. */
  91. val result =list11.reduce((agg,curr)=>{
  92. println(s"agg=${agg} curr=${curr}")
  93. agg+curr
  94. })
  95. println(result)
  96. /**
  97. * reduceRight(func:(集合元素类型,集合元素类型)=>集合元素类型):从右向左聚合
  98. * reduceRight中的函数的第一个参数是当前待聚合的元素,第二个参数是代表上一次的聚合结果
  99. * reduce中的函数的第二个参数在第一次聚合的时候,初始值=集合最后一个元素
  100. */
  101. list11.reduceRight((curr,agg)=>{
  102. println(s"agg=${agg} curr=${curr}")
  103. agg+curr
  104. })
  105. println(("---------------------"))
  106. /**
  107. * fold(默认值)(func:(集合元素类型,集合元素类型)=>集合元素类型):从左往右聚合
  108. * fold中的函数的第一个参数代表的是上一次的聚合结果,第二个参数是当前待聚合的元素
  109. * fold中的函数的第一个参数在第一次聚合的时候,初始值=默认值
  110. */
  111. list11.fold(100)((agg,curr)=>{
  112. println(s"agg=${agg} curr=${curr}")
  113. agg+curr
  114. })
  115. /**
  116. * foldRight(默认值)(func:(集合元素类型,集合元素类型)=>集合元素类型):从右向左聚合
  117. * foldRight函数的第一个参数是当前待聚合的元素,第二个参数代表的是上一次的聚合效果
  118. * foldRight中的函数的第二个参数在第一次聚合的时候,初始值=默认值
  119. */
  120. println(("--------------------------"))
  121. list11.foldRight(0)((curr,agg)=>{
  122. println(s"curr=${curr} agg=${agg}")
  123. agg+curr
  124. })
  125. }
  126. }

5.WordCount普通版

  1. package com.atguigu.chapter07
  2. import scala.io.Source
  3. object $16_WordCountLow {
  4. def main(args: Array[String]): Unit = {
  5. //1.读取文件
  6. val datas = Source.fromFile("datas/wc.txt").getLines().toList
  7. /**
  8. * List(
  9. * "hello spark hello"
  10. * "python scala spark"
  11. * "spark kafka flume"
  12. * "flume kafka scala"
  13. * )
  14. */
  15. //2.切割+压平
  16. val list = datas.flatMap(line => line.split(" "))
  17. //List(hello,spark,hello,python,scala,spark,spark,kafka,flume,flume,kafka,scala)
  18. //3.按照单词分组
  19. val groupedMap = list.groupBy(x=>x)
  20. /**
  21. * Map(
  22. * hello->list(hello,hello)
  23. * spark->list(spark,spark,spark)
  24. * )
  25. */
  26. //4.聚合
  27. val result = groupedMap.map(x => {
  28. (x._1, x._2.length)
  29. })
  30. //5.结果展示
  31. result.foreach(println)
  32. println("-"*100)
  33. Source.fromFile("datas/wc.txt")
  34. .getLines()
  35. .toList
  36. .flatMap(_.split(" "))
  37. .groupBy(x=>x)
  38. .map(x=>(x._1,x._2.size))
  39. .foreach(println(_))
  40. }
  41. }

6.WordCount高配版

  1. package com.atguigu.chapter07
  2. object $17_WordCountHight {
  3. def main(args: Array[String]): Unit = {
  4. val tupleList = List(("Hello Scala Spark World",4),("Hello Scala Spark",3),("Hello Scala",2),("Hello",1))
  5. //1.切割,赋予单词初始次数+压平
  6. val list = tupleList.flatMap(x => {
  7. //x=("Hello Scala Spark World",4)
  8. val arr = x._1.split(" ")//Array(Hello,Scala,Spark,World)
  9. val list = arr.map(y => (y, x._2))//Array(Hello->4,Scala->4,Spark->4,World->4)
  10. list
  11. })
  12. //2.按照单词进行分组
  13. val groupedMap = list.groupBy(_._1)
  14. //Map(
  15. // Hello -> List( Hello->4,Hello->3,Hello->2,Hello->1 )
  16. // Scala -> List( Scala->4,Scala->3,Scala->2)
  17. // .....
  18. // )
  19. //
  20. //3.聚合
  21. val result = groupedMap.map(x => {
  22. val sum = x._2.map(_._2).sum
  23. (x._1, sum)
  24. })
  25. //4.结果展示
  26. result.foreach(println)
  27. println("-"*100)
  28. tupleList.flatMap(line=>line._1.split(" ").map((_,line._2)))
  29. .groupBy(_._1)
  30. .map(x=>(x._1,x._2.map(_._2).sum))
  31. .foreach(println)
  32. }
  33. }

7.并行集合

  1. package com.atguigu.chapter07
  2. object $18_Par {
  3. /**
  4. * scala的集合默认都是单线程操作,如果想要多线程操作,需要转为并行集合
  5. * 普通集合转并行集合:集合名.par
  6. */
  7. def main(args: Array[String]): Unit = {
  8. val list = List(10,3,2,9,7,4)
  9. list.foreach(x=>{
  10. println(s"${Thread.currentThread().getName}---${x}")
  11. })
  12. val list2 = list.par
  13. list2.foreach(x=>{
  14. println(s"${Thread.currentThread().getName}---${x}")
  15. })
  16. }
  17. }

第二章.模式匹配

1.模式匹配定义

  1. package com.atguigu.chapter08
  2. import scala.io.StdIn
  3. object $01_MatchDefined {
  4. /**
  5. * 模式匹配的语法
  6. * 变量 match{
  7. * case 条件 => {...}
  8. * case 条件 => {...}
  9. * case 条件 => {...}
  10. * case 条件 => {...}
  11. * case 条件 => {...}
  12. * }
  13. * 模式匹配有返回值,返回值是符合条件的分支的块表达式的结果值
  14. */
  15. def main(args: Array[String]): Unit = {
  16. val wc = StdIn.readLine("请输入一个单词:")
  17. val r = wc match {
  18. case "hadoop" => {
  19. println("输入的是Hadoop")
  20. 40
  21. }
  22. case "spark" => {
  23. println("输入的是spark")
  24. 30
  25. }
  26. //匹配条件后面的{}可以省略
  27. case "flume" =>
  28. val a = 10
  29. val b = 20
  30. val c = a + b
  31. println("输入的是flume")
  32. 10
  33. //case x =>{
  34. //}
  35. //如果变量x在=>右边不使用可以用_代替,相当于switch的default
  36. case _ =>
  37. println("其他....")
  38. 20
  39. }
  40. println(r)
  41. }
  42. }

2.模式匹配守卫

  1. package com.atguigu.chapter08
  2. import scala.io.StdIn
  3. object $02_MatchIf {
  4. /**
  5. * 模式匹配守卫语法
  6. * 变量 match {
  7. * case 条件 if(布尔表达式) => ...
  8. * case 条件 if(布尔表达式) => ...
  9. * case 条件 if(布尔表达式) => ...
  10. * case 条件 if(布尔表达式) => ...
  11. * case 条件 if(布尔表达式) => ...
  12. *}
  13. * 有守卫的时候必须case满足条件并且守卫也满足条件才算匹配上
  14. */
  15. def main(args: Array[String]): Unit = {
  16. val line = StdIn.readLine("请输入一行语句:")
  17. line match {
  18. case x if(x.contains("hadoop"))=>
  19. println("句子包含hadoop")
  20. case x if(x.contains("spark"))=>
  21. println("句子包含spark")
  22. case x if(x.contains("kafka"))=>
  23. println("句子包含kafka")
  24. case x =>
  25. println("其他")
  26. }
  27. }
  28. }

3.匹配值

  1. package com.atguigu.chapter08
  2. import scala.io.StdIn
  3. object $03_MatchValue {
  4. /**
  5. * 匹配值的语法
  6. * 变量 match {
  7. * case 值 => ...
  8. * case 值 => ...
  9. * case 值 => ...
  10. * case 值 => ...
  11. * }
  12. * 如果需要使用外部变量作为匹配条件,此时该变量首字母必须大写
  13. */
  14. def main(args: Array[String]): Unit = {
  15. val wc = StdIn.readLine("请输入一个单词:")
  16. val Abc = "kafka"
  17. wc match {
  18. case Abc => println("kafka....")
  19. case "hadoop" => println("hadoop....")
  20. case "spark" => println("spark....")
  21. case "flume" => println("flume....")
  22. case abc => println("其他....")
  23. }
  24. }
  25. }

4.匹配类型

  1. package com.atguigu.chapter08
  2. import scala.util.Random
  3. object $04_MatchType {
  4. /**
  5. * 匹配类型语法
  6. * 变量名 match {
  7. * case X: 类型1 =>...
  8. * case X: 类型2 =>...
  9. * case X: 类型3 =>...
  10. * case X: 类型4 =>...
  11. *
  12. * ...
  13. * }
  14. */
  15. class Person
  16. def main(args: Array[String]): Unit = {
  17. val list =List(10,2,0,false,"hello",new Person)
  18. val index = Random.nextInt(list.size)
  19. println(s"index=${index}")
  20. list(index) match {
  21. case _:String => println("String....")
  22. case _:Int => println("Int....")
  23. case _:Double => println("Double....")
  24. case _:Person => println("Person....")
  25. case _:Boolean => println("Boolean....")
  26. }
  27. }
  28. }

5.匹配数组

  1. package com.atguigu.chapter08
  2. object $05_MatchArray {
  3. /**
  4. * 数组的匹配语法
  5. * 数组名 match {
  6. * case Array(x,y,z..)=>...
  7. * }
  8. */
  9. def main(args: Array[String]): Unit = {
  10. val arr = Array("Sxxxxx",10.0,2.5,false,10,1,2,2)
  11. arr match{
  12. case Array(x:String,y:Int,_*)=> println("匹配数组中至少有两个元素,第一个元素是String类型,第二个元素类型是Int")
  13. case Array(_,_*)=> println("匹配数组中至少有一个元素")
  14. case Array(x) => println("匹配数组中只有一个元素")
  15. case Array(x,_,z) => println("匹配数组中有三个元素")
  16. }
  17. }
  18. }

6.匹配列表

  1. package com.atguigu.chapter08
  2. object $06_MatchList {
  3. /**
  4. * List的匹配语法
  5. */
  6. def main(args: Array[String]): Unit = {
  7. val list:List[Any] =List(1,4,3,2)
  8. //第一种
  9. list match {
  10. case List(x)=> println("匹配list只有一个元素")
  11. case List(_,_,_)=> println("匹配list有三个元素")
  12. case List(_,_*)=> println("匹配list至少一个元素")
  13. case List(x:String,_*)=> println("匹配一个list至少一个元素")
  14. }
  15. //第二种
  16. list match{
  17. case x :: Nil => println("匹配list只有一个元素")
  18. case x :: _ :: z :: Nil => println("匹配list有三个元素")
  19. case x :: tail => println("匹配list至少一个元素")
  20. case (x:String) ::tail => "匹配list至少一个元素"
  21. }
  22. }
  23. }