【Scala】函数式编程高级部分

1 作为值的函数

在Scala中,函数是头等公民,就和数一样,可以在变量中存放函数

在Scala中,有一个约定,就是将函数赋值给变量时,必须在函数后面加上空格和下划线

/**
   * 函数可以作为值传递给另一个变量,或者另一个函数,
   * 语法特点:必须要在函数后面加上空格或者下划线
   */
  def funOps1(): Unit ={
    def sayGoodBye(name:String): Unit ={
      println(name)
    }
    
    //传递给变量
    val sayBye = sayGoodBye _
    sayBye("zhangsan")
    
    //传递给函数
    def sayByeBye = sayGoodBye _
    sayByeBye("lisi")
    
  }

2 匿名函数

在scala中,不需要给每一个函数命名

匿名函数的定义称为“Lambda表达式”

/**
   * 匿名函数:没有名字的函数
   * scala中定义一个完整的函数:def name(params):return={body}
   * 匿名函数:(params)=>{body}     匿名函数的实现
   *         (params)=>returnType 匿名函数的定义
   * 如何调用匿名函数?
   *      只有将匿名函数赋值给另外一个函数或变量来调用
   */
  def funOps2: Unit ={
    val sayBye = (name:String)=>{
      println(name)
    }
    def sayByeBye=(name:String)=>{
      println(name)
    }
    sayBye("wuer")
    sayByeBye("liuer")
  }

3 高阶函数

 /**
   * 高阶函数:
   *    带函数参数的函数,一个函数的参数是函数,这种函数为高阶函数
   */
  def funOps3: Unit ={
    //定义一个高阶函数
    def sayBye(name:String,func:(String)=>Unit): Unit ={
      func(name)
    }
    
    //调用函数sayBye
    sayBye("lisi1",(name:String)=>method(name))
    //传递匿名函数
    sayBye("zhaoliu",(name:String)=>println(name))
    
    //简化书写,如果匿名函数中只有一个变量,可以省略()
    sayBye("wuer",name=>println(name))
    //可以使用通配符"_"代替变量
    sayBye("lisi3",println(_))
    //最简形式
    sayBye("lisi4",println)
    sayBye("lisi5",method)

  }

  def method(str:String): Unit ={
    println(str)
  }

4 常见函数

4.1 filter

 /**
   * filter:过滤
   * filter:(A=>Boolean)
   * 过滤掉集合中的元素A,经过函数操作返回值为false的元素
   */
  def filterOps(): Unit ={
    //过滤掉集合中的偶数
    val array = 1 to 10
    val array1 = array.filter((num:Int) => ( num%2 != 0))
    
    //化简
    val array2 = array.filter(_ % 2!=0)

  }

4.2 map

/**
   * map:(p:A => B)
   * 将集合中的所有元素A都作用在该匿名函数p上,每一个元素都调用一次,元素A转化为B
   * A和B的数据类型可以不一致
   * map的操作就是一个one-2-one的映射操作
   */
 def mapOps(): Unit ={
   //将集合中的元素扩大1.5倍
   val array = 1 to 5
   var newArr = array.map((nem:Int)=>num*1.5)
   //化简
   var newArr1 = array.map(_ * 1.5)
 }

4.3 flatMap

/**
   * flatMap:(f:A=>Traversable[B])
   * 和map不同之处在于作用于匿名函数的返回值类型不同
   * map:one-2-one
   * flatMap:one-2-many,类似于sql中列转行的操作
   *
   * foreach
   */
 def flatmapOps: Unit ={
   val array = Array("a dog","a monkey","a cat")
   //提取集合中的每一个单词
   val words = array.flatMap((line:String)=>{
     line.split("\\s+")
   })
   //简化
   val words2 = array.flatMap(_.split("\\s+"))

   words2.foreach(println)
 }

4.4 reduce

  /**
   * reduce:(p:(A,A)+>A)
   * reduce是一个聚合函数,将两个A转化为一个A,集合中的元素进行聚合操作,得到新的值
   * 例如:求和操作
   *      var sum =0
   *      for(i<- 1 to 5){
   *        sum = sum +i
   *      }
   * 第一个A:sum
   * 第二个A:i
   * 第三个A:聚合结束后的结果
   */
 def reduceOps: Unit ={
   val array = 1 to 6
   var sum = 0

   sum = array.reduce(_ + _)
   println(sum)
 }

4.5 dropWhile

  /**
   * dropWhile:(p:A=>Boolean)
   * 该函数和filter一样,作用在集合的每一个元素,返回值为boolean类型
   * dropWhile删除元素,直到不满足条件位置
   */
 def dropWhileOps: Unit ={
   val array = Array(3,-6,7,1,0,9,4,2)
   //循环删除其中的偶数,直到条件不满足
   val arr = array.dropWhile(_%2!=0)
   arr.foreach(println)
 }

4.6 sortwith

  /**
   * sortWith:排序操作
   * ((A,A)=>boolean),返回值是布尔值
   */
 def sortWithOps: Unit ={
   val array = Array(3,-6,7,1,0,9,4,2)
   val array1 = array.sortWith((v1,v2)=>v1<v2)
   array.foreach(print)
 }

4.7 groupBy

/**
   * groupBy:分组操作
   */
 def groupByOps: Unit ={
   val array = Array(
     "a,b",
     "a,c",
     "d,e",
     "d,f",
     "g,h"
   )
   //分组
   val arr = array.groupBy(line => line.substring(0,line.indexOf(",")))

   //将原来的集合进行分组,每个组内元素有两个
   val arr2 = array.grouped(2)

   for(arr <- arr2){
     println(arr.mkString("[",",","]"))
   }
 }

4.8 partition

  /**
   * partition:按照一定的提交进行分组,最后分为两组
   * (p:A=>boolean):(集合A,集合B)
   * 在每一个元素A上进行作用该匿名函数,满足条件,共同构成返回值集合A,不满足条件的构成集合B
   * 最后完成分区
   */
 def partitionOps: Unit = {
   val array = Array(3,-6,7,1,0,9,4,2)
   //将集合按照4进行分区,小于4一个集合,大于等于4一个集合
   val (left,right) = array.partition(_<4)
   println(left.mkString("[",",","]"))
   println(right.mkString("[",",","]"))
 }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐的冲浪码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值