函数进阶

61 阅读2分钟

函数的字面量语法

除了使用def之外的,另一种定义函数的方式

语法:var 变量 = (参数列表)=>{方法体}

它省略了def,函数名以及函数的返回值类型。

/*
* 函数字面量
* 另一种定义函数的方式
* */
//定义函数的方式一:def
def getSum(x:Int, y:Int):Int = {
  x + y

  }
//定义函数的方式二:字面量
val getSum1 = (x:Int,y:Int) => {
  x  + y
}

def main(args: Array[String]): Unit = {
  println(getSum(10,20))
  println(getSum1(10,20))

}

把函数作为参数

某个函数的参数是函数


  /*
  * 函数字面量的简化写法
  * 代码只写一句,省略{}
  * _占位符来替代形参
  * */


  //定义函数的方式二:字面量
  val getSum = (x:Int,y:Int) => {
    x  + y
  }
  //省略{}
  val getSum1 = (x:Int,y:Int) => x + y


  //使用_来替代形参
  val getSum2 = (_:Int) + (_:Int)

  val getSum3:(Int,Int)=> Int = _ + _

  def main(args: Array[String]): Unit = {
    println(getSum(10,20))
    println(getSum1(10,20))
    println(getSum2(10,20))
    println(getSum3(10,20))

  }
}

把函数作为返回值

函数的返回值是一个函数。

  /*
  * 把一个函数 当做参数 传递给另一个函数
  *
  * */

  //定义两字面量函数.(Int,Int)=>Int 看出一种数据类型
  val f1:(Int,Int)=> Int = _ + _
  //val a:Int
  val f2: (Int,Int) => Int = _ * _

  //定义一个函数,它有三个参数
  //参数一:类型是(Int,Int)=>它表示这里需要一个参数
  def test(fn:(Int,Int)=>Int,x:Int,y:Int):Int = {
    fn(x,y)
  }

  def main(args: Array[String]): Unit = {
    println(test(f1,10,20))
    println(test(f2,10,20))


  }

代码如下:


/*
* 部分应用函数
* 如果一个函数需要3个参数,而我们只给了2个参数,会怎么样?
*
*/

def getSum(a:Int, b:Int, c:Int):Int = {
  a + b + c
}

def main(args: Array[String]): Unit = {
  println( getSum(10, 20, 30) )

  val t = getSum(10, 20,_) // t 就是部分应用函数!

  val t1 = getSum(_,20,_) // t 就是部分应用函数!

  println( t(50) )

  println( t1(20,50) )
}

代码如下:

/*
* 高阶: 一种特殊的函数,它的参数或者返回值是函数类型
* map函数
*
*/
def main(args: Array[String]): Unit = {
  val arr1 = Array(1,2,3,4,5,6)
  //Array是一个构造器,用它来定义一个数组
  //arr1就是一个数组对象,它有很多的方法,其中就有map
  //for 循环来输出数组中每个元素

  val fn = (x:Int) => x * 2
  //fn是一个函数,它被传给了map。map是一个高阶函数
  val arr2 = arr1.map(x => x * 2 )
  
  //for 循环来输出数组中每个元素
  for(i <- arr2){
    println(i)
  }

}
*/
def main(args: Array[String]): Unit = {
  val arr1 = Array(1, 2, 3, 4, 5)
  val arr2 = arr1.map(x => x * x)

  for (i <- arr2) {
    print(s"${i} ")
  }

  val arr3 = Array(-1, 2, -3, -4)

  //绝对值
  val arr4 = arr3.map(x => if (x > 0) x else -x)

  println()
  for (i <- arr4) {
    print(s"${i} ")
  }
}

/**
   * foreach的练习题
   * 是数组的每一个元素都执行一次函数
   *
   */
  def main(args: Array[String]): Unit = {
    val arr1 = Array(1, 2, 3, 4, 5)
 //   arr1.foreach(x => println(x))

    arr1.foreach(print)
    arr1.foreach(println())




    }
  }
}