Scala高级语法入门 (二) 函数式编程第二篇 高阶函数

本文深入探讨Scala中的高阶函数,包括函数作为对象、参数传递、匿名函数、函数返回值、闭包、控制抽象、函数柯里化、递归和惰性函数等概念。通过实例解析,帮助读者理解这些高级特性。
摘要由CSDN通过智能技术生成

🙆‍♂️🙆‍♂️ 写在前面

​🏠​ 个人主页:csdn春和
📚 推荐专栏:更多专栏尽在主页!
JavaWeb专栏(从入门到实战超详细!!!)
SSM专栏 (更新中…)
​📖​ 本期文章:Scala高级语法入门 (二) 函数式编程第二篇 高阶函数
如果对您有帮助还请三连支持,定会一 一回访!🙋🏻‍♂️



函数的高级语法

在Scala中,函数是一等公民,所谓的高阶函数,其实就是将函数当成一个类型来使用,而不是当成特定的语法结构。

对于一个函数我们一般的使用是 定义函数 简单调用函数

object Scala03_FunctionSenior01 {
   
  def main(args: Array[String]): Unit = {
   
    // TODO 函数高级

    // 调用函数
    say()
    
    // 定义函数
    def say(): Unit ={
   
      println("hello world!")
    }
  }
}

函数还有更加高级的用法:

1、函数作为对象

如果将函数作为整体而不是执行结果赋值给变量,那么需要特殊符号 _ 下划线

def function(): Unit ={
   
      println("你好!")
    }

val fun1 = function _  // 使用特殊符号 _ 将函数作为一个整体一个对象赋值给变量fun1
 
fun1()  // fun1变量 由于赋值了一个函数 所以可以调用

万物皆对象,但是对象都是有类型的,那么就意味着函数对象也有类型

在这里插入图片描述

函数独立使用时声明参数没有限制可以声明无限个参数,但是如果将函数作为对象给别人使用,那么声明的函数的参数最多只能有22个

但是上面的写不好理解也不好接受

所以函数类型有另外一种写法 (输入参数类型) => (输出类型)

在这里插入图片描述

2、函数可以作为值进行传递

// TODO 函数高级 函数作为值传递

// 1、调用函数 将函数的返回值赋值给一个变量
//    val v = say()
val v = say // 当函数没有参数的时候 可以省略小括号
println(v)

// 2、在被调用函数 foo 后面加上 _,相当于把函数 foo 当成一个整体, 传递给变量 f1
// 但是在调用的时候不能省略小括号
val f1 = say _
say()
f1()
//    f1    // 不能执行

// 3、如果明确变量类型,那么不使用下划线也可以将函数作为整体传递给变量

val f2: () => Int = say

f2()
//    f2

3、函数作为参数传递

【1】定义一个函数,函数参数还是一个函数

需求: 这里我们定义一个函数 计算两个数 具体计算规则通过参数传递

// f 表示函数名称;(Int,Int) 表示输入两个 Int 参数;Int 表示函数返回值
def calculate(a: Int, b: Int, f: (Int, Int) => Int): Int = {
   
 // 表明传递进来的是一个函数 函数是传递两个int型的参数 最后返回int型结果
  f(a, b)
}

【2】再定义一个函数 参数和返回值类型和calculate函数的输入参数一致

这里我们定义一个加法计算规则的函数

// 回顾至简原则
/*    def add(a:Int,b:Int): Int ={
      return a + b
    }
    // 至简原则  省略return
    def add(a:Int,b:Int): Int ={
       a + b
    }

    // 类型可以推断可省略返回值类型
    def add(a:Int,b:Int) ={
       a + b
    }
    */
// 函数内只有一行代码 省略{}
def add(a: Int, b: Int) = a + b

【3】将 add 函数作为参数传递给 f1 函数

//    val res = calculate(1,3,add _)  // 将add函数整体作为一个参数传递
val res = calculate(1, 3, add) // 将add的类型可以推断出来 那么 下划线 _ 可以省略不写 目的就是将函数add 当做一个整体 而不是调用
println("res = "+res)

这里的重点就是要注意传递参数的时候 传递的是函数的整体 需要加上 _ 如果类型是明确的那么可以省略 下划线 _

【4】查看输出

在这里插入图片描述

4、匿名函数

❓ 问题思考

如果我们想要计算两个数相乘呢?两个数相除呢? 我们是不是又要定义一个函数 用于计算两个数的乘积,在定义一个函数计算两个数相除

显然是不用的,我们可以采用传递匿名函数的形式实现不同的功能,只要匿名函数的参数和形参函数中的参数类型一致就可

// 计算两个数的乘积
val res2 = calculate(2, 3, (x: Int, y: Int) => {
   
  x * y
}) // 传递匿名函数 匿名函数主要应用于函数作为参数时
println("res2 = "+res2)

在这里插入图片描述

☑️ 匿名函数也可以使用函数的至简原则

1、如果函数体只有一行 那么可以省略{}
2、如果参数的类型可以推断出来 参数类型可以省略
3、如果参数只有一个那么可以省略小括号 这里因为参数有两个故不能省略()
4、如果参数在使用时按照顺序只使用了一次 那么可以使用下划线代替参数

  // TODO 5、匿名函数的至简原则
    // 1、如果函数体只有一行 那么可以省略{}
    //    val res3 = calculate(2, 3, (x: Int, y: Int) => x * y)
    // 2、如果参数的类型可以推断出来 参数类型可以省略
    //    val res3 = calculate(2, 3, (x, y) => x * y)
    // 3、如果参数只有一个那么可以省略小括号 这里因为参数有两个故不能省略()
    // 4、如果参数在使用时按照顺序只使用了一次 那么可以使用下划线代替参数
    
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值