zoukankan      html  css  js  c++  java
  • Scala学习十二——高阶函数

    一.本章要点

    • 在Scala中函数是”头等公民“(可以作为参数,返回值,赋值给其他);
    • 可以创建匿名函数,通常还会交给其他函数;
    • 函数参数可以给出需要稍后执行的行为;
    • 许多集合方法都接受函数参数,将函数应用到集合中的值;
    • 有许多语法上的简写让你以简短且易读的方式表达函数参数;
    • 可以创建操作代码块的函数,像是内建的控制语句

    二.作为值的函数

      在Scala中,函数是头等公民,和数字一样,在变量中存放函数:

    import scala.math._
    val num=3.14
    val fun=ceil _
    //注:ceil函数后的_意味确实指的这个函数,而不是忘记传参数,可以调用它,传递它

    三.匿名函数

      没有函数名的函数,例val triple=(x:Double) => 3*x等同于def triple(x:Double)=3*x。

      Array(3.14,1.43,2.0).map((x:Double)=>3*x),map也可以用{},Array(3.14,1.43,2.0).map{(x:Double)=>3*x},Array(3.14,1.43,2.0) map {(x:Double)=>3*x}

    四.带函数参数的函数

      如 def valueAtOneQuarter(f:(Double) => Double)=f(0.25),可以接受参数的函数,也是高阶函数,类型是(参数类型) = >结果类型,则该函数为((Double)=>Double)=>Double,也可以返回一个函数,例def nulBy(factor:Double)=(x:Double)=>factor*x,类型为(Double)=>((Double)=>Double)。

    五.参数(类型)推断

      当将一个匿名函数传递给另一个函数或者方法时,Scala会尽可能帮你推断出类型信息,例:valueAtOneQuarter((x:Double)=>3*x)简写为valueAtOneQuarter((x)=>3*x),一个参数还可以valueAtOneQuarter(x=>3*x),如果=>只出现一次,还可以valueAtOneQuarter(3* _)。

    六.一些有用的高阶函数

      map作用到某个集合的所有元素并返回结果,foreach也是作用于某个集合的所有元素但无返回值,fileter接受集合筛选匹配特定条件的值,reduceLeft接受二元函数,并应用到序列所有函数。  

    七.闭包

      能够读取其他函数内部的函数,由代码和代码用到的任何非局部变量定义构成。  

    八.SAM转换

      SAM:在Java中,将动作放在一个实现某接口的类中,然后将该类的一个实例传递给另一个方法,且这些接口只有单个抽象方法,这被叫做SAM模型。

      需要用到隐式转换(implicit),例:

    九.柯里化

      指将原来接受两个参数的函数变为新的接受一个参数的函数的过程,有时候需要把某个参数拿出来提供更多用于类型判断的信息。

      如:def mul(x:Int,y:Int)=x*y转换为def mulOnrAtTime(x:Int)=(y:Int)=>x*y,还可以简写为def nulOneAtTme(x:Int)(y:Int)=x*y

    十.控制抽象

      将一系列语句组成不带参数也没有返回值的函数。

    def runInThread(block:()=>Unit){
    new Thread{
    override def run(){block()}
    }.start()}
    
    
    //调用
    runInThread(println("Hi");Thread.sleep(10000);println("Bye"))
    
    //利用换名表示方法省掉=>
    def runInThread(block:=>Unit){
    new Thread{
    override def run(){block()}.start()}
    }
    //调用
    runInThread(println("Hi");Thread.sleep(10000);println("Bye"))

    十一.return表达式

      在Scala中,不需要用return语句返回函数值,函数的返回值就是函数体的值。

      可以用return来从一个匿名函数中返回值包含这个匿名函数的带名函数,例:

    def indexOf(str:String,ch:Char):Int={
    var i=0
    util(i==str.length){
    if(str(i)==ch)return i
    i+=1
    }
    return -1
    }

    十二.练习

  • 相关阅读:
    《构建之法》第8、9、10章的读后感和第一个sprint总结
    实验三 进程调度模拟程序
    构建之法第6、7章的读后感
    实验二 作业调度模拟程序
    0415博客园评价
    0414复利计算6.0-----结对编程
    0408~送给小伙伴的汉堡包
    学习进度条
    Sprint three
    sprint one
  • 原文地址:https://www.cnblogs.com/lyq-biu/p/11969732.html
Copyright © 2011-2022 走看看