• scala中的高阶函数


    版权申明:转载请注明出处。
    文章来源:http://bigdataer.net/?p=332
    排版乱?请移步原文获得更好阅读体验

    1.scala中的函数

    scala是一门面向对象和函数式编程相结合的语言,前面的文章已经讲了类、对象、继承等面向对象特有的语言特性,接下来将关注一下函数式编程的相关知识。在scala中,函数和变量一样,都是scala的一等公民。与函数相关的代码片段如下:

    scala    7行

    //定义一个匿名函数 (x:Int) => 3*x //将函数赋值给一个变量 val fun = (x:Int) => 3*x //将函数传递给一个方法或者函数时省略参数类型 map(x=>x*3)

    2.高阶函数

    正常的一个函数只能接受常量或者普通变量作为参数,但是高阶函数可以接受函数作为参数,同时高阶函数的返回值也可以是函数。比如常见的有map,filter,reduce等函数,它们可以接受一个函数作为参数。

    3.闭包

    仅从字面上来理解,很容易将闭包和包关联起来,其实不然。闭包是一种函数,函数的返回值依赖于声明在外部的一个或者多个变量,这里的返回值是指返回的函数。如:

    scala    9行

    //定义一个闭包 def closure(rate:Double)=(x:Int)=>rate*x //给定不同的rate值,闭包返回不同的函数 val lowrate = closure(2) val highrate = closure(6) lowrate(10) //返回20 highrate(10) //返回60

    4.SAM转换

    首先SAM是Single Abstract Method的缩写,不是山姆大叔的sam。是指单个抽象方法,比如说java swing里面的ActionListener接口就只有一个actionPerformed方法,我们可以说ActionListener接口是SAM类型。
    SAM转换的目的就是让这种只有一个方法的操作使用一个函数代替。比如按钮点击后的动作,我们传入一个函数去实现而不是new一个ActionListener的内部类去实现。如:

    scala    15行

    //传统写法 button.addActionListener(new ActionListener{ override def actionPerformed(event:ActionEvent)={ count +=1 }) //使用sam转换 button.addActionListener((event:ActionEvent)=>count+=1) //这里需要提供一个隐士转换,将函数转换成一个ActionListener的实例 implicit def makeAction(action:(ActionEvent)=>Unit) = new ActionListener{ override def actionPerformed(event:ActionEvent){action(event)} }

    5.柯里化

    柯里化是一个将传入两个参数的函数变为传入一个参数的函数的过程。比如:
    def plus(x:Int,y:Int) => x+y
    变为:def plus(x:Int)=(y:Int)=>x+y

    更多文章请关注微信公众号:bigdataer

  • 相关阅读:
    函数指针和回调函数
    MATLAB神经网络(2) BP神经网络的非线性系统建模——非线性函数拟合
    MATLAB神经网络(1)之R练习
    R时间序列分析实例
    自动控制理论的MATLAB仿真实例(二)
    自动控制理论的MATLAB仿真实例(一)
    Mathtype快捷键&小技巧
    Latex数学符号对应表
    MATLAB神经网络(1) BP神经网络的数据分类——语音特征信号分类
    R语言实战(三) 图形初阶
  • 原文地址:https://www.cnblogs.com/bigdataer/p/7010034.html
Copyright © 2020-2023  润新知