scala-匿名、柯里化、闭包

1.匿名函数

1
2
3
4
5
6
7
8
9
10
11
12
13
// 作为值的函数
// 定义列表,记录1-10之间的数据
val list1 = (1 to 10).toList
// 创建函数对象,用来将int -> String
val func = (x: Int) => "*" * x
//调用map方法,将第一步的列表转换成目标列表
val list2 = list1.map(func)
// 打印
println(list2)
// 匿名函数
val list3 = list1.map((x: Int) => "*" * x)
val list3 = list1.map(_ => "*" * _)
println(list3)

2.柯里化

1
2
3
4
5
6
7
8
9
10
11
12
// 需求,定义方法,完成两个字符串的拼接
// 方式1:普通方法
def mergel(s1: String, s2: String) = s1.toUpperCase + s2.toUpperCase
// 方式2:柯里化写法
def merge2(s1: String, s2: String)(f1: (String, String) => String) = f1(s1, s2)

// 柯里化
// 方式一:普通方法
val str1 = mergel("hkj", "cpdd")
println(str1)
// 方式2:柯里化方法
val str2 = merge2("hkj","cpdd")(_.toUpperCase + _.toUpperCase)

3.闭包

1
2
3
4
5
6
7
8
9
10
11
// 闭包
// 需求: 定义一个函数,用来获取两个整数的和,通过闭包的形式实现
// 闭包指的是可以访问不在当前作用于范围数据的一个函数
// 定义变量x, 初始值为10
val x = 10
// 定义函数getSum(), 用来获取两个整数的和
val getSum = (y: Int) => {
x + y
}
// 调用getSum(), 并打印
println(getSum(20))

4.控制抽象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 控制抽象
// 控制抽象也是函数的一种,它可以让我们更加灵活的使用函数,假设函数a的参数列表需要接受一个函数b,且函数b没有输入值也没有返回值,那门函数a就被称之为控制抽象函数
// 定义一个函数myShop, 该函数接受一个无参数无返回值的函数
val myShop = (f1: () => Unit) => {
println("hkjcpdd")
// 在myShop函数中调用f1函数
f1() //表示顾客具体购买的商品
println("hkjmjj")
}
// 调用myShop函数
myShop{
() => {
println("我要买hkj")
println("我要买hkjcpdd")
println("我要买hkjmjj")
println("我要买hkjyjj")
}
}

5.案例:计算器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 定义一个方法,用来完成两个int类型数字的计算(加减乘除)
// 方式一:普通写法
def add(a: Int, b: Int) = a + b
def subtract(a: Int, b: Int) = a -b
def multiply(a: Int, b: Int) = a * b
def divide(a: Int, b: Int) = a / b
// 方式二:通过柯里化方法
def calculate(a: Int, b: Int)(func: (Int, Int) => Int) = func(a, b)

// 案例:计算器
println(add(10, 5))
println(subtract(10, 5))
println(multiply(10, 5))
println(divide(10, 5))
// 柯里化计算器
println(calculate(10, 5)(_ + _))
println(calculate(10, 5)(_ - _))
println(calculate(10, 5)(_ * _))
println(calculate(10, 5)(_ / _))