函数的字面量语法

93 阅读3分钟

函数字面量

另一种定义函数的方式

/*
 * 函数字面量
 * 另一种定义函数的方式
 */

// 定义函数的方式一: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))
}

函数字面量的简化写法

* 1. 代码只有一句,省略 {}

* 2. _ 占位符来替换形参

/*
 * 函数字面量的简化写法
 * 1. 代码只有一句,省略 {}
 * 2. _ 占位符来替换形参
 */
//
val getSum = (x:Int, y:Int) => {
  x + y
}

// 省略 {}
val getSum1 = (x:Int, y:Int) => x + y

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

// 使用 _ 来代替形参. (Int, Int)=>Int 就是getSum3的类型!
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 f2: (Int, Int) => Int = _ * _


// 定义一个函数,它有三个参数
// 参数1:类型是 (Int,Int)=>Int 。它表示这里需要一个函数
def test(fn: (Int, Int) => Int, x: Int, y: Int): Int = {
  fn(x, y) // 确保函数体内部括号正确
}

def main(args: Array[String]): Unit = {
  // 注意:Scala 中判断相等使用 ==,而非 ===(除非引入了特定库)
  println(test(f1, 10, 20) == f1(10, 20)) // 修正此处可能的括号错误
  println(test(f2, 10, 20))
}

部分应用函数

如果一个函数需要3个参数,而我们只给了2个参数,会怎么样?

/*
 * 部分应用函数
 * 如果一个函数需要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, _) // t1 就是部分应用函数
  println(t(50))
  println(t1(20, 50))
}

高阶函数:一种特殊的函数,它的参数或者返回值是函数类型。

* 1. map函数

/*
 * 高阶函数:一种特殊的函数,它的参数或者返回值是函数类型。
 * 1. 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(fn)

  // for 循环来输出数组中每个元素
  for(i <- arr2){
    println(i)
  }
}

map的练习题

/*
 * 1. map练习题
 */
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 ")
  }
}