package com.scala.A
/**
* 闭包的具体应用
* */
object scala_function_03_1 {
def main(args: Array[String]): Unit = {
//------------------------------------------------------------------------------------------------------------------
/**
* 常规逻辑
* 两个变量相加的函数
* 如果是想计算两万个数相加呢,这种思想就太麻烦了
**/
def add0(a: Int, b: Int): Int = {
a + b
}
//------------------------------------------------------------------------------------------------------------------
/**
* 1)考虑固定一个(一些)加数的场景 */
def add1(b: Int): Int = {
4 + b
}
/** 这种扩展方式的调用,只需要传一个参数进来就行 */
val res1 = add1(2)
println(res1)
//------------------------------------------------------------------------------------------------------------------
/**
* 2)扩展固定加数改变的情况 */
def add2(b: Int): Int = {
5 + b
}
//------------------------------------------------------------------------------------------------------------------
/**
* 3)将固定加数也作为一个参数传入,但是把这个固定加数作为第一层参数传入(把通用性进行扩展)
**/
def add3(): Int => Int = {
/** 定义了一个局部变量,传给内部函数做加法 */
val a: Int = 1
def add3_1(b: Int): Int = {
a + b
}
/** 将内部函数作为返回值调用 */
add3_1
}
//------------------------------------------------------------------------------------------------------------------
/**
* 3.1) 将上面升级,换种写法
* 此时的函数就是传入一个变量a,返回值类型为一个函数(Int=>Int),将一个函数作为返回值调用,内部函数调用
* 这里就是闭包,内部函数执行时调用了外部变量,通用性与实用性的一个平衡和结合
**/
def add4(a: Int): Int => Int = {
def add4_1(b: Int) = {
a + b
}
add4_1
}
/** 这种扩展方式的调用,传入两个参数 */
println(add4(25)(25))
/** lambda表达式写法 */
def add5(a: Int): Int => Int = a + _
println(add5(99)(1))
//------------------------------------------------------------------------------------------------------------------
}
}
08-11
7133
