[Scala高阶函数示例]

在Scala中,可以直接将某个函数作为参数传入其他的函数。带函数参数的函数由于是一个接受函数参数的函数,故被称为高阶函数(High-Order function)。

/**

 * Scala高阶函数示例

 */

objectHighOrderFunction {

  /*

    * greeting就是高阶函数

    * name:String类型的一个正常参数

    * func:函数类型的一个参数,定义一个接受String类型的,返回值类型为Unit的函数这样的一个参数函数

    * */

  defgreeting(name: String, func: (String) => Unit) = {

    func(name)

  }

  defsayHiFunc(name: String) = {

    println(s"Hi,${name}")

  }

  defmain(args: Array[String]): Unit = {

    defsayHelloFunc(name: String) = {

      println(s"Hello,${name}")

    }

    //把函数赋值给变量

    valsayHello = sayHelloFunc _

    greeting("xiaoming", sayHello)

    //=======================================================

    greeting("zhangsan", sayHiFunc _)

    //由于greeting函数定义的时候要求第二个参数必须是函数类型,所以这里可以直接写函数名称,

    //表示其实就是传递了一个函数,可以不加下划线

    greeting("zhangsan", sayHiFunc)

    //=======================================================

    //匿名函数一般和高阶函数是一起使用的,匿名函数作为高阶函数的输入参数

    greeting("xiaoming", (abc: String) => {

      println(s"nihao,${abc}")

    })

    //高阶函数的简化

    //可以将输入参数的数据类型省略,原因:scala的编译器会自动的根据上下文的内容就行推断

    //自动推断数据类型

    greeting("zhangsan", (abc) => { println(s"nihao,${abc}") })

    //如果只有一个输入参数,可以考虑省略小括号

    greeting("zhangsan", abc => { println(s"nihao,${abc}") })

    //如果左侧的所有的输入参数在右侧的函数体中有且仅有一次而且使用的顺序和输入参数的列表中的顺序是一致的

    //可以考虑省略输入参数,并使用_代替,实际开发中不建议使用,阅读起来很费劲

    greeting("zhangsan", println(_))    //===============================================================================================

    defopera(a: Int, b: Int, func: (Int, Int)=> Int) = {

      println(s"result=${func(a, b)}")

    }

    valvalue1: Int = 9;

    valvalue2: Int = 2;

    println(s"求和:${value1} + ${value2}")

    opera(value1, value2, (x: Int, y: Int) => x+y)

    opera(value1, value2, (x, y) => x+y)

    //第一个下划线表示第一输入参数,第二个下划线表示第二个输入参数

    opera(value1, value2, _ + _)

    println(s"差值${value1} - ${value2}")

    opera(value1, value2, (x: Int, y: Int) => x-y)

    opera(value1, value2, (x, y) => x-y)

    //第一个下划线表示第一输入参数,第二个下划线表示第二个输入参数

    opera(value1, value2, _ - _)

    println(s"乘积${value1} * ${value2}")

    opera(value1, value2, (x: Int, y: Int) => x*y)

    opera(value1, value2, (x, y) => x*y)

    //第一个下划线表示第一输入参数,第二个下划线表示第二个输入参数

    opera(value1, value2, _ * _)

    println(s"取模:${value1} / ${value2}")

    opera(value1, value2, (x: Int, y: Int) => x/y)

    opera(value1, value2, (x, y) => x/y)

    //第一个下划线表示第一输入参数,第二个下划线表示第二个输入参数

    opera(value1, value2, _ / _)

  }

}

 

运行结果:

Hello,xiaoming

Hi,zhangsan

Hi,zhangsan

nihao,xiaoming

nihao,zhangsan

nihao,zhangsan

zhangsan

求和:9 + 2

result=11

result=11

result=11

求差:9 - 2

result=7

result=7

result=7

求积:9 * 2

result=18

result=18

result=18

求模:9 / 2

result=4

result=4

result=4


  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值