scala教程:高阶函数-将函数作为参数,传递给另一个函数

说明

传统方式传参有以下2种:

  • 基本数据类型 或 字符串,如:数字 1,或 字符串"hello" 作为参数,传递给一个方法

  • 引用类型,如:将 student 对象,作为参数,传递给一个方法

此处与传统方式不同,是将 函数作为参数,传递给另一个函数

应用场景

数组、集合 的 foreach() 方法

数组的元素已经确定,即:数据是确定的,对数据的处理不确定,对外(其他程序员)提供一个入口,可以自定义对数据处理

好处:简化开发,只需要定义对数据的处理函数即可

例子1(可略)

  1. 定义一个函数 add(),有1个形参
  2. 定义一个函数 test() ,有1个形参,但该形参的类型是 函数
  3. 然后将该 add() 函数作为参数,传递给函数 test()

定义函数 add()

def add(a:Int) : Int = {
  return a+2
}

定义函数 test()

def test(fun:(Int) => Int):Int = {
  return fun(1)
}

调用

println(test(add))

例子2

  1. 定义一个函数 add(),有2个形参
  2. 定义一个函数 test() ,有1个形参,该形参的类型是 函数类型
  3. 然后将该 add() 函数作为参数,传递给函数 test()
def main(args: Array[String]): Unit = {

  //定义函数
  def add(a:Int,b:Int) : Int = {
    return a+b
  }

  //定义test()函数,其形参的类型是函数类型
  def test(fun:(Int,Int) => Int):Int = {
    return fun(1,3)
  }

  //将 add() 函数作为参数,传递给test()函数
  println(test(add))

}

执行过程如下图:

例子2 的缺点

在 test() 函数中,调用 fun(1,3),传递 1 和 3 ,写死了,这是不合理的

例子3-解决例子2的缺点

为了解决 例子2的缺点,改造如下:

  1. 给 test() 函数,增加2个 Int 型形参
  2. 在 test() 函数内,调用 fun() 函数时,将这个参数 传递 给 fun()函数
def main(args: Array[String]): Unit = {
  //定义函数
  def add(a:Int,b:Int) : Int = {
    return a+b
  }

  /*
  * 定义test()函数,
  * 第一个形参的类型是函数类型
  * 第2、3个形参的类型是Int类型
  */
  def test(fun:(Int,Int) => Int,a:Int,b:Int):Int = {
    return fun(a,b)
  }

  println(test(add,100,200))

}

执行过程如下:


原文出处:/show_1IX302xy3m14.html