🙆♂️🙆♂️ 写在前面
🏠 个人主页: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、如果参数在使用时按照顺序只使用了一次 那么可以使用下划线代替参数