58 Scala高阶函数

高阶函数

  • scala中函数和IntString、Class等其他类型处于同等地位
  • 可以向其他类型的变量一样被传递和操作

作为值的参数

  • 可以将函数传递给一个方法
object demo01 {
  def main(args: Array[String]): Unit = {
    val func = (num:Int) => "*" * num

    println((1 to 10).map(func))
  }
}

匿名函数

object demo01 {
  def main(args: Array[String]): Unit = {
   println((1 to 10).map("*" * _))
  }
}

柯里化

  • 将原先接收多个参数的方法转换为多个只有一个参数的参数列表的过程
object demo01 {
  def calc(x:Int, y:Int)(func_calc:(Int,Int) => Int) = {
    func_calc(x,y)
  }

  def main(args: Array[String]): Unit = {
    println(calc(10,10)(_ + _))
    println(calc(4,2)(_ / _))
  }
}

闭包

  • 闭包就是一个函数,访问了不在当前作用域范围的变量
object demo01 {
  def main(args: Array[String]): Unit = {
    val y = 10
    val add = (x:Int) => {x + y}

    println(add(5))
  }
}
  • 柯里化就是一个闭包
def add(x:Int)(y:Int) = {
    x + y
}

//上述代码相当于
def add(x:Int) = {
    (y:Int) => x + y
}

隐式转换与隐式参数

  • 隐式转换指以implict关键字声明的带有单个参数的方法
  • 它是自动调用的,自动将某种类型转换为另外一种类型

使用隐式转换

  • 当对象调用类中不存在的方法或者成员时,编译器会自动将对象进行隐式转换
  • 当方法中的参数类型与目标类型不一致时,编译器会自动将对象进行隐式转换
class RichFile(val file:File) {
    // 读取文件为字符串
    def read() = {
        Source.fromFile(file).mkString
    }
}

object RichFile {
    // 定义隐式转换方法
    implicit def file2RichFile(file:File) = new RichFile(file)
}

def main(args: Array[String]): Unit = {
    // 加载文件
    val file = new File("./data/1.txt")

    // 导入隐式转换
    import RichFile.file2RichFile

    // file对象具备有read方法
    println(file.read())
}

自动导入隐式转换

  • 如果当前作用域中有隐式转换方法,会自动导入隐式转换
class RichFile(val f:File) {
  // 将文件中内容读取成字符串
  def read() = Source.fromFile(f).mkString
}

object ImplicitConvertDemo {
  // 定义隐式转换方法
  implicit def file2RichFile(f:File) = new RichFile(f)

  def main(args: Array[String]): Unit = {
    val f = new File("./data/textfiles/1.txt")

    // 调用的其实是RichFile的read方法
    println(f.read())
  }
}

隐式参数

object demo01 {
  def quote(what:String)(implicit delimiter:(String, String)) = {
    delimiter._1 + what + delimiter._2
  }
  object  ImplicitParm {
    implicit val DEFAULT = ("<<<", ">>>")
  }

  def main(args: Array[String]): Unit = {
    import ImplicitParm.DEFAULT
    println(quote("hello world"))
  }
}
上一篇:MFC 实现一个Sleep功能函数


下一篇:C# .NET Framework 3.5 下 Task 与 EventWaitHandle 的简单例子