Scala 函数之高阶用法(炼狱级)

引言

Scala 不仅是完全面向对象语言,而且还是完全面向函数编程语言,所以 Scala 叫做多范式编程语言,Scala 的函数非常强大

  • 函数可以作为函数的返回值
  • 函数可以作为函数的参数
  • 函数可以赋值给变量

函数作为返回值

函数作为返回值,需要注意 _ (下换线)的用法

把 返回值函数 写在外边

// 定义一个函数,作为返回值
def fun(name: String): Unit = {
        println(s"fun_name = $name ")
    }

// 定义执行函数
def fun1(name: String) = {
        // 加个 _(下划线)表名该函数是返回值
        println(s"fun1_name = $name ")
        fun _
    }

// 执行函数,返回值函数不会被执行
fun1("Bob")
-------------------------
fun1_name = Bob

// 执行返回值函数
fun1("Bob")("bigdataboy")
-------------------------
fun1_name = Bob 
fun_name = bigdataboy

把返回值函数 写在内部

函数执行结果与上面一样,只是这样写跟容易理解

def fun1(name: String) = {
        // 返回值函数
        def fun(name: String): Unit = {
                println(s"fun_name = $name ")
            }
        println(s"fun1_name = $name ")
        fun _
    }

函数柯里化

就是把上面的格式进行简化,通过函数调用就可以看出来

所以 Scala 里就会看到 ()()()()()() 这样的调用

def fun(name: String)(name1: String): Unit = {
    println(s"name = $name")
    println(s"name1 = $name1")
}
fun("Bob")("Bbigdataboy")
----------------------------------------------
fun1_name = Bob 
fun_name = bigdataboy

函数作为参数

把函数作为参数,不同点在于 规定参数类型时的写法不一样

def fun(f: String=> Unit): Unit = {
    f()
}
// 定义参数类型解析
f: String=> Unit
参数名称: 传入函数的参数类型 => 传入函数的返回值类型

小例子

自定义传入一段逻辑(函数)给函数

def fun(f: Int=> Int,num: Int): Unit ={
    // 执行传入的函数(有参数也需要传参数)
    println(f(num))
}

参数函数

// 把传入的参数 不做任何处理 直接返回
def fn(n: Int): Int = {
    n
}

执行函数

fun(fn,5)
---------
5

传入匿名函数(作为参数)

这也是 Spark 用的最多的,匿名函数可以看看这个

// 定义一个函数
def fun(f: ()=> Unit): Unit = {
    f()
}

执行函数(传入匿名函数)

fun(()=> {println("Hello bigdataboy")})
---------------------------------------
Hello bigdataboy

函数赋值给变量

变量可以接受一个匿名函数

val add= (a: Int,b: Int) => a + b
// 调用
println(add(12,34))
---------------------------------
46
发表评论 / Comment

用心评论~