Scala--第四天

一、迭代器 iterator

  适合Scala中所有集合的遍历

 1     var a = List(1, 2, 3, 4)
 2     var b = a.iterator
 3     //hasNext:判断迭代器是否由下一个元素   next:获取下一个元素
 4     while (b.hasNext) {
 5       println(b.next)
 6     }
 7     //结果
 8     //1
 9     //2
10     //3
11     //4

二、函数式编程

  用处:Scala 针对集合的操作,简化代码

  1.遍历 froeach

1     //完成写法  foreach 中传的是一个函数 :x代表集合(容器)中的每一个元素
2     //注意:foreach没有返回值 ,即为Unit
3     a.foreach((x: Int) => {
4       println(x)
5     })
6     //简化写法一:省去参数的类型指定 ,scala做类型推断
7     a.foreach(x => println(x))
8     //建议写法二:使用下划线 代替 集合中的每个元素
9     a.foreach(println(_))

  2.映射 Map

    格式:原始集合.map(f:(A))  #A:代表集合中的每个元素  

      返回值是一个新的集合

1     var a = List(1, 2, 3, 4)
2     //每个集合中的元素+1 得到新的集合
3     var b = a.map(x => x + 1)
4     println(b)
5     var c = a.map(_ + 1)
6     println(c)
7     //List(2, 3, 4, 5)
8     //List(2, 3, 4, 5)

  3.映射扁平化(降维处理) flatmap

    格式:原始集合.flatMap(f:(A))

    返回值:一个新的集合

 1     var a = List("cmx01 cmx02", "cmx03 cmx04")
 2     //正常的思路与写法
 3     var b = a.map(_.split(" ")).flatten
 4     //    println(b)
 5     //List(cmx01, cmx02, cmx03, cmx04)
 6     //flatMap 简化
 7     var c = a.flatMap(x => {
 8       x.split(" ")
 9     })
10     println(c)
11     //List(cmx01, cmx02, cmx03, cmx04)
12     var d = a.flatMap(_.split(" "))
13     println(d)
14     //List(cmx01, cmx02, cmx03, cmx04)

  4.过滤 filter 按照一定的规则,对集合中的元素进行过滤

    格式:原始集合.filter(p:(A))=>Boolean

    返回值:一个新集合

 1     var a = List(1, 2, 3, 4, 5, 6, 7)
 2     //过滤偶数
 3     var b = a.filter(x => {
 4       x % 2 == 0
 5     })
 6     println(b)
 7     //过滤奇数,并使用简便的写法
 8     var c = a.filter(_ % 2 == 1)
 9     println(c)
10     //List(2, 4, 6)
11     //List(1, 3, 5, 7)

  5.是否存在 exists

1     var a = List(1, 2, 3, 4, 5, 6, 7)
2     println(a.exists(_==3))
3     //true

  6.排序sorted sortBy sortWith

 1     var a = List(9, 6, 4, 3, 5, 2, 1)
 2     //默认排序 升序
 3     var b = a.sorted
 4     println(b)
 5     //List(1, 2, 3, 4, 5, 6, 9)
 6 
 7     //根据指定元素进行排序
 8     var c = List("cmx 1", "zzz 2", "uuu 3")
 9     var d = c.sortBy(_.split(" ")(0))
10     println(d)
11     //List(cmx 1, uuu 3, zzz 2)
12 
13     //自定义排序sortWith
14     //降序排列 大于号 降序  小于号 升序
15     var e = a.sortWith(_ > _)
16     println(e)
17     //List(9, 6, 5, 4, 3, 2, 1)
18 
19     //注意简写的 _  不能出现再 if 判断里
20     var f = a.sortWith((x, y) => {
21       if (x < y) true else false
22     })
23     println(f)
24     //List(1, 2, 3, 4, 5, 6, 9)

  关于 _ 的小结

  1.下划线 不能出现在 if 判断中

  2.当函数的参数,只在函数体中出现一次,并且函数体没有嵌套调用

  7.分组 groupby

 1     var a = List(("cmx", 1), ("cmx01", 1), ("xxx", 0))
 2     //需求 分组统计 0,1 的个数
 3     var b = a.groupBy(_._2)
 4     println(b)
 5     //打印的结果为一个Map
 6     //Map(1 -> List((cmx,1), (cmx01,1)), 0 -> List((xxx,0)))
 7     for (i <- b) println(i)
 8     //循环打印的结果却是元组
 9     //(1,List((cmx,1), (cmx01,1)))
10     //(0,List((xxx,0)))
11 
12     var c = b.map(x => x._1 -> x._2.length)
13     println(c)
14     //Map(1 -> 2, 0 -> 1)
15     c.foreach(println(_))
16     //(1,2)
17     //(0,1)

   8.聚合 reduce,reduceLeft,reduceRight

    格式:集合.reduce(op:(A1,A2)=>A1)

      A1:截止当前位置的聚合结果

      A2:当前需要聚合的元素

 1     var a = List(1, 2, 3)
 2     var b = a.reduce((x, y) => x + y)
 3     println(b)
 4     //6
 5     var c = a.reduce(_ + _)
 6     println(c)
 7     //6
 8 
 9     var d = a.reduceLeft(_ - _)
10     var e = a.reduceRight(_ - _)
11     println(d)
12     println(e)
13     //-4
14     //2

  注意:reduceLeft reduceRight 的区别

9.折叠 fold(相较于聚合,多了一个初始值)

    格式:集合.fold(初始值)(op:(A1,A2)=>A1)  #A1,A2 与聚合含义相同

1     var a = List(1, 2, 3)
2     var b = a.fold(10)(_ - _)
3     var c = a.foldRight(10)(_ - _)
4     println(b)
5     println(c)
6     //4
7     //-8
原文地址:https://www.cnblogs.com/cmxbky1314/p/12283479.html