高阶函数

82 阅读3分钟

(一.)什么是高阶函数: 高阶函数:是一种特殊的函数,特殊之处在于:它指使用其他函数作为参数或者返回值。 Scala的常见高阶函数包括Array.map、flatten、flatmap、foreach、reduce、filter和fold等。 (二.)map函数

object t52 {
  def main(args: Array[String]): Unit = {
    val arr = Array(1,2,3,4,5)
//    val fn = (x:Int) => x * 2// fn是一个字面里函数
//    val arr1 = arr.map(fn)// map是一个高阶函数,因为它的参数类型是 函数!
//没有必要单独定义一个函数fn,这里直接写在map函数内,此时它的采纳数类型是函数
    val arr1 = arr.map(x => x * 2)
//[练]:1.把(1,2,3,4,5) ——>(1,4,9,16,25) 
//val arr1 = arr.map(x => x * x)
//[练]:2.把(-1,-2,-3,-4,-5) ——>(1,,2,3,4,5)
//val arr1 = arr.map(x => if(x>0) x else -x)
    //用for循环输出
    for(i <- arr1){
      println(i)
    }
  }
}

(三.)foreach函数 打印数组中的元素

object t53 {
  /**
   * 数组
   * 1.把数组中每个元素都打印出来
   * foreach:依次使用当前的杉树来处理数组中的每一个元素
   * 
   */
  def main(args: Array[String]): Unit = {
    val arr = Array(-1,-2,-3,-4,-5)
//arr.foreach(x => { println(x)})
    arr.foreach(println)
  }
}

(四.)filter函数: 在数组中找出元素是偶数的,并组成新数组。

object t54 {
  /**
   * 数组
   * 1.把数组中的偶数保持下来,组成新数组
   *filter:过滤
   * filter(),如果fn 的返回值是true,就保留这个元素
   *
   */
  def main(args: Array[String]): Unit = {
    val arr = Array(1,2,3,4,5)
    //x%2 ==0 用来判断是否为偶数
    val arr1 = arr.filter(x => x%2 == 0)
//打印新数组
//[练]:把(60,59,80,70)——>(60,80,70)
//var arr = Array(60,59,80,70).filter(x => x >=60)
//arr.foreach(println)
    arr.foreach(println)
  }
}

(五.)flatten函数

object t55 {
  /**
   *二维数组
   *flatten 不要加()的函数
   */
  def main(args: Array[String]): Unit = {
    var arr1 = Array ( Array(1,2,3),Array(4,5,6));
    //arr1(0).foreach(println)
    println(arr1(0)(0))
    val arr2 = arr1.flatten
    arr2.foreach(println)
  }
}

高阶函数(2): (一).reduce: 是一种集合操作,用于对集合中的元素进行聚合操作,返回一个单一的结果。

object t57 {
  /**
   *reduce:聚合。
   */
  def main(args: Array[String]): Unit = {
    var arr = Array (1,2,3,5)
    var sum = arr.reduce((x,y) => x + y)
    //var s = arr.sum
    println(sum)
  }
}

(二.)reduceLeft-reduceRight

object t58 {
  /**
   *reduce:聚合。
   */
  def main(args: Array[String]): Unit = {
    var arr = Array (-1,20,30,15)
    //求最大值
    val max = arr.reduce((x,y) =>if(x > y)x else y)
    println(max)
    //求最小值
    val min = arr.reduce((x,y) =>if(x < y)x else y)
    println(min)
  }
}

(三)fold

object t59 {
  /**
   *fold:带初值的reduce
   */
  def main(args: Array[String]): Unit = {
    var arr = Array (1,2,3)
    //求和
    //val sum = arr.reduce((x,y) => x+y)
    val sum1 = arr.fold(100)((x,y) => x+y)// 106
    println(sum1)
  }
}

(四)stored函数

object t60 {
  /**
   *stored:带初值的reduce
   */
  def main(args: Array[String]): Unit = {
    var arr = Array(-1,20,2,50)
    //降序
    var arr1 = arr.stored//对于数组类型的数据,从小到大升序排列
    var arr2 = Array("banana","zip","b","a","apple")
    //降序
    var arr3 = arr2.sorted//对于字符类型数据,按照字母表的顺序排
    arr3.foreach(println)
    
  }
}

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

object t61 {
  /**
   *sortWith
   * 自定义排序规则
   */
  def main(args: Array[String]): Unit = {
    var arr = Array(-1,8,2,1,3)

    //排序函数:(元素a,元素b)=>Bool。如果返回true,则表示元素a应排在元素b之前。
    //var arr1 = arr.sortWith((a,b)=> a到0的距离<b到0的距离)
    //对arr中所有元素按照他们距离3 的距离的大小从小到大排序
    var arr1 = arr.sortWith( (a,b)=> Math,abs(a-3)<Math,abs(b-3))
    arr1.foreach(println)
    
  }
}