Scala函数编程进阶

    1. 函数和变量一样,作为Scala的一等公民,函数可以直接赋值给变量;如:val hiData = hiBigData _
    val hiData = hiBigData _
    hiData("Spark")

    def hiBigData(name : String) {
      println("Hi, " + name)
    }
    1. 函数更常用的方式是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称,但是如果你需要使用的话, 一般会把这个匿名函数赋值给一个变量(其实就是val常量),Spark源码中大量存在这种源码;
    //匿名函数
    val f = (name:String) => println("Hi, " + name)
    f("Kafka")
    1. 函数可以作为参数直接传递给函数,这极大的简化了编程的语法;原因如下:
      第一:以前Java的方式是new出一个接口实例,并且在接口实例的回调方法callback中来实现业务逻辑,现在是直接把回调方法 callback传递给我们的函数,且在函数体中直接使用,这毫无疑问的简化了代码的编写,提升了开发效率;
      第二点:这种方式非常方便编写复杂的业务逻辑和控制逻辑,对于图计算,机器学习,深度学习等而言至关重要;
      第三点:函数作为函数的参数传递的编程方式是称之为高阶函数的编程方式,Spark源码和应用程序开发中至少60%都是这种代码;
    def getName(func : (String) => Unit, name : String): Unit = {
      func(name)
    }
    getName(f, "Scala")

    Array(1 to 10 : _*).map { (item: Int) => 2 * item}.foreach { x =>println(x)}
    1. 函数式编程一个非常强大的地方之一在于函数的返回值可以是函数,当函数的返回类型是函数的时候,这个时候就表明Scala的函数实现了闭包!Scala闭包的内幕是:Scala的函数背后是类和对象,所以,Scala的参数都作为了对象的成员!所以后续可以继续访问,这就是实现闭包的原理;
    1. Currying,复杂函数式编程中经常使用,可以维护变量在内存中的状态,且实现返回函数的链式功能,可以实现非常复杂的算法和逻辑;
    def funcResult(messsage : String) = (name:String) => println(messsage + name)
    funcResult("Hello")("Java") //Currying函数写法

你可能感兴趣的:(Scala函数编程进阶)