Scala基础 -- 6.高阶函数

6 高阶函数

  Scala混合了面向对象和函数式的特性,我们通常将可以作为参数传递到方法中的表达式叫做函数。在函数式编程语言中,函数是“头等公民”,高阶函数包含:作为值的函数、匿名函数、闭包、柯里化等等。

6.1 作为值的函数

  可以像任何其他数据类型一样被传递和操作的函数,每当你想要给算法传入具体动作时这个特性就会变得非常有用。

val arr1 = Array(1,2,3,4,5)
//定义一个函数,并将函数赋给变量fun
val fun = (x: Int) => x * 2
//将函数作为参数传入方法中
val arr2: Array[Int] = arr1.map(fun)
println(arr2.toBuffer)

  定义函数时格式:val 变量名 = (输入参数类型和个数) => 函数实现和返回值类型
  “=”表示将函数赋给一个变量
  “=>”左面表示输入参数名称、类型和个数,右边表示函数的实现和返回值类型

6.2 匿名函数

//没有将函数赋给变量的函数叫做匿名函数
arr1.map((x: Int) => x * 3)
//由于Scala可以自动推断出参数的类型,所有可以写的跟精简一些
arr1.map(x => x * 3)
//神奇的下划线
arr1.map(_ * 3)

6.3 科里化

  柯里化(Currying)指的是把原来接受多个参数的函数变换成接受一个参数的函数过程,并且返回接受余下的参数且返回结果为一个新函数的技术。
在这里插入图片描述

def main(args: Array[String]): Unit = {
    //不适用科里化的加法
    println(oldSum(1, 3))
    //使用科里化加法
    println(curriedSum(1)(2))
    //也可以只传部分参数,返回剩余参数的函数,即返回x+1的函数
    val fun1: Int => Int = curriedSum(1)
    //调用返回的参数,传入剩余需要的参数,即科里化把一个方法分步了
    println(fun1(2))
}
//普通方法
def oldSum(x: Int, y: Int) = x + y
//科里化定义加法函数,把函数定义为多个参数列表
def curriedSum(x: Int)(y: Int) = x + y
//科里化参数也可以分开写
def curriedSum1(x: Int) = (y: Int) => x + y
//多个参数都可以
def curriedSum2(x: Int)(y: Int)(z: Int) = (o: Int) => x + y + z + o

  scala柯里化风格的使用可以简化主函数的复杂度,提高主函数的自闭性,提高功能上的可扩张性、灵活性。可以编写出更加抽象,功能化和高效的函数式代码。

6.4 闭包

  闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。
  闭包通常来讲可以简单的认为是可以访问不在当前作用域范围内的一个函数。

def main(args: Array[String]): Unit = {
    val y = 10
    //变量y不处于其有效作用域时,函数还能够对变量进行访问
    val add = (x: Int) => {
        //在add中有两个变量:x和y。其中的一个x是函数的形式参数,
        //在add方法被调用时,x被赋予一个新的值。
        // 然而,y不是形式参数,而是自由变量
        x + y
    }
    println(add(5))
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值