匿名函数
* 语法
* (参数列表)=>{函数体}
* 示例 (x: Int, y: Int) => {x / y}
* 使用场景
* 函数作为 实参 传递时
* 极简原则
* 参数类型可以省略, 会根据 形参自动推断
* 参数类型省略后,且当只有一个参数时,可以省略 (),参数>1时,不可省略
* 当函数体只有一行时,可以省略 {}
* 当方法体内只 使用一次参数时,形参的名称和=>可以 省略,方法体内用 _ 代替
* 注意事项
* 匿名函数,不需要写返回值类型
*
* */
/**
* @author gaocun
* @create 2021-10-20 8:01 AM */
object 匿名函数_05 {
/*
* 匿名函数
* 语法
* (参数列表)=>{函数体}
* 示例 (x: Int, y: Int) => {x / y}
* 使用场景
* 函数作为 实参 传递时
* 极简原则
* 参数类型可以省略, 会根据 形参自动推断
* 参数类型省略后,且当只有一个参数时,可以省略 (),参数>1时,不可省略
* 当函数体只有一行时,可以省略 {}
* 当方法体内只 使用一次参数时,形参的名称和=>可以 省略,方法体内用 _ 代替
* 注意事项
* 匿名函数,不需要写返回值类型
*
* */
def main(args: Array[String]): Unit = {
//定义函数
def sum(x: Int, y: Int): Int = x + y
def mul(x: Int, y: Int): Int = x * y
// 定义 带函数指针参数的函数
def twoNumber(pt: (Int, Int) => Int, x: Int, y: Int): Int = pt(x, y)
//调用 - 传入定义好的函数
println(twoNumber(sum, 4, 2))
//调用 - 出入匿名函数(标准调用)
println(twoNumber((x: Int, y: Int) => {
x / y
}, 4, 2))
//极简原则 - 参数类型可以省略, 会根据 函数定义 twoNumber 时,形参自动推断
println(twoNumber((x, y) => {
x / y
}, 4, 2))
//极简原则 - 参数类型省略后,且当只有一个参数时,可以省略 (),参数>1时,不可省略
//极简原则 - 匿名函数如果只有一行,则大括号也可以省略
println(twoNumber((x, y) => x / y, 4, 2))
//极简原则 - 当方法体内只 使用一次参数时,形参的名称和=>可以 省略,方法体内用 _ 代替
println(twoNumber(_ / _, 4, 2))
println("========扩展练习==========")
/*扩展练习*/
/* 练习 1:定义一个匿名函数,并将它作为值赋给变量 fun。函数有三个参数,类型分别
* 为 Int,String,Char,返回值类型为 Boolean.
* 要求调用函数 fun(0, “”, ‘0’)得到返回值为 false,其它情况均返回 true。
*
* */
var fun = (x: Int, y: String, z: Char) => {
if (x == 0 && y == "" && z == '0')
false
else
true
}
println(fun(0, "", '0'))
println(fun(1, "", '0'))
/*
* 练习 2: 定义一个函数 func,它接收一个 Int 类型的参数,返回一个函数(记作 f1)。
* 它返回的函数 f1,接收一个 String 类型的参数,同样返回一个函数(记作 f2)。
* 函数 f2 接 收一个 Char 类型的参数,返回一个 Boolean 的值。
* 要求调用函数 func(0) (“”) (‘0’)得到返回值为 false,其它情况均返回 true。
*
* */
def func(x: Int) = {
println("func进入")
def f1(str: String) = {
println("f1进入")
def f22(ch: Char): Boolean = {
println("f22进入")
if (ch == '0') false
else true
}
f22 _
}
f1 _
}
println(func(0)("")('1'))
}
}