Scala函数式编程学习,简单案例

函数式编程

  • 所谓的函数式编程指定的式 方法的参数列表可以接收函数对象
  • 例如:add(10,20)就不是函数式编程,add(函数对象) 这种格式就叫做函数式编程
  • 我们将来编写Spark/Flink大量业务代码时,都会使用到函数式编程。下面的这些操作式学习的重点
函数名功能
foreach遍历集合
map对集合进行转换
flatmap进行扁平化操作
filtter过滤出指定的集合
sorted对集合元素按照默认排序
sortBy按照指定字段排序
sortWith自定义排序
groupBy按照指定条件分组
reduce聚合操作
fold折叠计算
foreach

案例代码

  def main(args: Array[String]): Unit = {
    // 定义一个列表
    val list1 = List(1,2,3,4)
    // 遍历每个元素,并且对每个元素进行操作,x为遍历的每个元素
    list1.foreach( (x:Int) => println(x))

    list1.foreach(x => println(x))

    list1.foreach(println(_))
  }
映射(map)

案例代码

  def main(args: Array[String]): Unit = {
    val list1 = List(1,2,3,4)
    val test = list1.map((x:Int) => { //x=>(1,2,3,4) 遍历x
      "*" * x
    })      //(1,2,3,4) =>(*,**,***,****)
    // 类型推断
    val test1 = list1.map(a => "*" * a)
    // 下划线
    val test2 = list1.map("*" * _)

    for (elem <- test) println(elem)
  }
扁平化映射(flatMap)

先map然后再flatten

案例代码

  def main(args: Array[String]): Unit = {
    // 将列表 “hadoop hive spark flink flume”,"kafka hbase sqoop storm"
    // 转换成单独的单词,并且放到一个list中
    val list = List("hadoop hive spark flink flume", "kafka hbase sqoop storm")
    val test = list.flatMap((x:String)=>{
      x.split(' ')
    })
    println(list)
    print(test)
  }
过滤(filter)

案例代码

  def main(args: Array[String]): Unit = {
    // 过滤数字列表中的偶数:
    // List(1,2,3,4,5,6,7,8,9)
    val list1 = List(1,2,3,4,5,6,7,8,9)
    val list2 = list1.filter(_%2!=0)
    println(list2)
  }
排序
1. 默认排序(sorted)

案例代码

  def main(args: Array[String]): Unit = {
    // 定义一个列表,包含以下元素:3,1,2,9,7
    // 2.对列表进行升序排序
    // 3.对列表进行降序排序
    val list = List(3,1,2,9,7,15)
    // 默认升序排列
    val upSort = list.sorted
    println(upSort)
    // 降序:将升序后的列表倒序就是降序
    val downSort = list.sorted.reverse
    println(downSort)
  }
2. 指定字段排序

案例代码

  def main(args: Array[String]): Unit = {
    //根据列表List("01 hadoop","02 flume","03 kafka","04 redis")
    val list = List("01 hadoop","02 flume","03 kafka","04 redis")
    val test = list.sortBy((x:String)=>{
      // 将字符串切割成不同的字段
      val dd = x.split(' ')
      // 按照第二个字段排序
      dd(1)
    })
    println(test)
  }
3. 自定义排序规则

案例代码

  def main(args: Array[String]): Unit = {
    // 对List(12,3,4,1,6,8,7)进行降序排序
    val list = List(12,3,4,1,6,8,7)
    val test = list.sortWith((x,y) => {
      // 降序
      x > y
      // 升序
      // x < y
    })
    println(test)
  }
分组

案例代码

  def main(args: Array[String]): Unit = {
    val list = List("胡歌"->"男", "杨幂" -> "女","吴彦祖" -> "男","胡歌" -> "男")
    // 按性别分组
    val test = list.groupBy(x => x._2) 
      // 结果为Map('男'->list("胡歌"->"男","吴彦祖" -> "男","胡歌" -> "男"),‘女’->list( "杨幂" -> "女",))
    println(test)
    // 统计人数
    val mapDd = test.map(x => (x._1,x._2.size))
    println(mapDd)
  }
聚合操作
1. reduce

案例代码

  def main(args: Array[String]): Unit = {
    // 定义一个列表,包含:1,2,3,4,8,5,6,7,9,10
    // 计算列表的和
    val list = List(1,2,3,4,8,5,6,7,9,10)
    val sum = list.reduce(_ + _)
    // list.reduce((a,b) => { a + b })
    println(sum)
  }

案例

  1. 定义列表:记录学生的成绩,格式为:姓名,语文成绩,数学成绩,英语成绩,学生信息如下:(“张三”,37,90,100),(“李四”,90,71,81),(“赵六”,59,21,72),(“田七”,100,100,100),(“赵甲第”,98,99,83)
  2. 获取所有语文成绩在60分及以上的同学信息
  3. 获取所有学生的总成绩
  4. 按照总成绩降序排列
  5. 打印结果
  def main(args: Array[String]): Unit = {
    //1. 定义列表:记录学生的成绩,格式为:姓名,语文成绩,数学成绩,英语成绩,学生信息如下:("张三",37,90,100),("李四",90,71,81),("赵六",59,21,72),("田七",100,100,100),("赵甲第",98,99,83)
    val info = List(("张三",37,90,100),("李四",90,71,81),("赵六",59,21,72),("田七",100,100,100),("赵甲第",98,99,83))
    //2. 获取所有语文成绩在60分及以上的同学信息
    val chinese = info.filter(x => {
      x._2 >= 60
    })
    println("语文及格:"+chinese)
    //3. 获取所有学生的总成绩
    val sum = info.map(x => {
      val all = x._2 + x._3 + x._4
      (x._1 , x._2 , x._3 , x._4 , all)
    })
    println("成绩总和:"+sum)
    //4. 按照总成绩降序排列
    val sort1 = sum.sortWith((_._5 > _._5))
    println("降序排序:"+sort1)

  }