Scala中的高阶函数

37 阅读4分钟

一:什么是高阶函数

高阶函数:是一种特殊的函数,特殊之处在于:它指使用其他函数作为参数或者返回值。

Scala的常见高阶函数包括Array.map、flatten、flatmap、foreach、reduce、filter和fold等。

二:map函数

作用:通过对数组的每一个元素应用一个函数来构建一个新数组。

语法: 新数组 = 旧数组.map(旧元素=>新元素)

任务一:把数组(1,2,3,4,5) → (2,4,6,8,10)

object txy47 {
  def main(args: Array[String]): Unit = {
    val ar = Array(1,2,3,4,5)
    val arr = ar.map( x => x*2)
    for(i <- ar){
      println(i)
    }
    for(j <- arr){
      println(j)
    }
  }
}

任务二:把数组(1,2,3,4,5) -> (1,4,9,16,25)

object txy47 {
  def main(args: Array[String]): Unit = {
    val ar = Array(1,2,3,4,5)
    val arr = ar.map( x => x*x)
    for(i <- ar){
      println(i)
    }
    for(j <- arr){
      println(j)
    }
  }
}

任务三:把数组(-1,-2,-3,-4) -> (1,2,3,4)(求绝对值)

object txy49 {
  def main(args: Array[String]): Unit = {
    val ar = Array(-1,-2,-3,-4)
    val arr = ar.map( x => if(x>0)x else -x)
    for(i <- ar){
      println(i)
    }
    for(j <- arr){
      println(j)
    }
  }
}

三:foreach函数

作用:对数组的每一个元素应用函数。

语法:数组.foreach(元素=>{})

任务: 打印数组中的元素

object txy50 {
  def main(args: Array[String]): Unit = {
    val ar = Array(1,2,3,4,5)
    ar.foreach(println)
  }
}

四:filter函数

作用:对数组元素使用函数进行过滤。

语法:新数组= 旧数组.filter(元素=>bool)  它的参数是一个函数,这函数的返回值是布尔值。如果返回为true就保留。

任务一:在数组中找出元素是偶数的,并组成新数组。(1,2,3,4,5) → (2,4)

object txy50 {
  def main(args: Array[String]): Unit = {
    val ar = Array(1,2,3,4,5)
    val arr = ar.filter(x => x%2 ==0 )
    arr.foreach(println)
  }
}

任务二:去掉不及格分数

object txy51 {
  def main(args: Array[String]): Unit = {
    val ar = Array(49,60,76,56,78)
    val arr = ar.filter(x => x>=60)
    arr.foreach(println)
  }
}

五:flatten函数

作用:将二维数组中的元素展平至单数组中。

语法:二维数组.flatten。不需要写()


object txy52 {
  def main(args: Array[String]): Unit = {
    val ar = Array(    Array(1,2,3),      Array(4,5,6))
    println(ar(0)(0))
    val arr = ar.flatten
    arr.foreach(println)
  }
}

六:reduce

作用:reduce 是一种集合操作,用于对集合中的元素进行聚合操作,返回一个单一的结果。它通过指定的二元操作(即取两个元素进行操作)对集合中的所有元素进行递归处理,并最终将其合并为一个值

语法:reduce 函数需要一个函数作为参数,这个函数接受两个相同类型的参数,并返回一个值。

image.png

object txy53 {
  def main(args: Array[String]): Unit = {
    val ar = Array(1,2,3,4,5)
    var arr = ar.reduce((x,y) => x + y)
    println(arr)
  }
}

reduceLeft-reduceRight

reduceLeft是从集合的左侧开始聚合,与reduce等价; reduceRight是从集合的右边开始。

println( Array(1,2,3).reduceRight((x,y)=>x-y) ) // (1 - (2 - 3)) = (1 - (-1)) = 2

 println( Array(1,2,3).reduceLeft((x,y)=>x-y) ) // ((1-2)-3)

任务:计算数组中的最大最小值

object txy54 {
 def main(args: Array[String]): Unit = {
   val ar = Array(1,2,3,4)
   val max = ar.reduce((x,y) => if (x>y) x else y)
   println(max)
   val min = ar reduce((x,y) => if (x>y) y else x)
   print(min)
 }
}

七:fold

作用:fold 是一种集合操作(与reduce类似),用于对集合中的元素进行聚合操作,返回一个单一的结果,需要提供一个初始的“种子”值。

语法:数组.fold(初值)(函数)

计算带初值的累积

object txy56 {
  def main(args: Array[String]): Unit = {
    val ar = Array(1,2,3,4)
    val arr = ar.fold(10)((x,y) => x+y)
    //初始值为10
    print(arr)
    //结果为10+1+2+3+4=20
  }
}

八:sorted函数

功能:对元素进行排序。它会直接使用元素自身的自然顺序进行排序

语法:新数组 = 原数组.sorted

对数值排序,对字符串排序

object txy57 {
  def main(args: Array[String]): Unit = {
    val ar = Array('a','b','f','t','m')
    //a,b,f,m,t
    val ar1 = Array(1,4,6,3,545,124,-123)
    //-123,1,3,4,6,124,545
    val arr = ar.sorted
    val arr1 = ar1.sorted
    arr.foreach(println)
    arr1.foreach(println)
  }
}

九:sortedWith

如何将Array(-1,0,1,3,2)中的所有元素,按它们到0点的距离排序?

功能:按自定义规则排序

语法:新数组 = 原数组.sortedWith(排序函数)

排序函数:(元素a,元素b)=>Bool。如果返回 true,则 表示元素a应排在元素b之前。

object txy58 {
  def main(args: Array[String]): Unit = {
    val ar = Array(-1,0,-3,-2,-5,4,3,7)
    val arr = ar.sortWith((a,b) => Math.abs(a-0) < Math.abs(b-0))
    //判断Math.abs(a-0)<Math.abs(b-0)如果为true则返回a排在b前面
    arr.foreach(println)
  }
}