版权申明:转载请注明出处。
文章来源: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

scala中的高阶函数的更多相关文章

  1. Python 函数式编程 & Python中的高阶函数map reduce filter 和sorted

    1. 函数式编程 1)概念 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念.wiki 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数 ...

  2. Python中的高阶函数与匿名函数

    Python中的高阶函数与匿名函数 高阶函数 高阶函数就是把函数当做参数传递的一种函数.其与C#中的委托有点相似,个人认为. def add(x,y,f): return f( x)+ f( y) p ...

  3. JS中的高阶函数

    JS中的高阶函数 高阶函数是指以函数作为参数的函数,并且可以将函数作为结果返回的函数. 1. 高阶函数 接受一个或多个函数作为输入 输出一个函数 至少满足以上一个条件的函数 在js的内置对象中同样存在 ...

  4. Java中的函数式编程(五)Java集合框架中的高阶函数

    写在前面 随着Java 8引入了函数式接口和lambda表达式,Java 8中的集合框架(Java Collections Framework, JCF)也增加相应的接口以适应函数式编程.   本文的 ...

  5. ES6中的高阶函数:如同 a => b => c 一样简单

    作者:Sequoia McDowell 2016年01月16日 ES6来啦!随着越来越多的代码库和思潮引领者开始在他们的代码中使用ES6,以往被认为是"仅需了解"的ES6特性变成了 ...

  6. JavaScript中的高阶函数

    之前写的<JavaScript学习手册>,客户跟我说有些内容不适合初学者,让我删了,感觉挺可惜的,拿到这里和大家分享. JavaScript中的一切都是对象,这句话同样适用于函数.函数对象 ...

  7. javascript中的高阶函数, 和 类定义Function, 和apply的使用

    参考: http://www.cnblogs.com/delin/archive/2010/06/17/1759695.html js中的类, 也是用function关键字来定义的: function ...

  8. python中的高阶函数

    高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下 ...

  9. Javascript中的高阶函数介绍

    高阶函数:高阶看上去就像是一种先进的编程技术的一个深奥术语,一开始我看到的时候我也这样认为的. Javascript的高阶函数 然而,高阶函数只是将函数作为参数或返回值的函数.以下面的Hello,Wo ...

随机推荐

  1. 常用移动web开发框架--转载

      阅读目录 1.1 jQuery mobile flat-ui 主题 1.2jQuery mobile Bootstrap 主题 4.1 GMU 4.2 Clouda+ 4.3 efe 5.1 Sp ...

  2. lsof,fuser,xargs,print0,cut,paste,cat,tac,rev,exec,{},双引号,单引号,‘(字符串中执行命令)

    cut用来从文本文件或标准输出中抽取数据列或者域,然后再用paste可以将这些数据粘贴起来形成相关文件. 粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同.paste将按行将不同文件行 ...

  3. 网络编程 - UDP协议

    UDP协议 服务端 ''' UDP 协议 又称 数据报协议 SOCK_DGRAM ''' from socket import * # 一般不这样做 会重名 但写socket可以这样写 因为要用到太多 ...

  4. 剑指Offer——删除链表中重复的结点

    题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理 ...

  5. Python高级特性(3): Classes和Metaclasses(转)

    原文:Python高级特性(3): Classes和Metaclasses 类和对象 类和函数一样都是Python中的对象.当一个类定义完成之后,Python将创建一个“类对象”并将其赋值给一个同名变 ...

  6. Redis for Python开发手册

    redis基本命令 String Set set(name, value, ex=None, px=None, nx=False, xx=False) 在Redis中设置值,默认,不存在则创建,存在则 ...

  7. 006-Shell printf 命令

    一.概述 printf 命令模仿 C 程序库(library)里的 printf() 程序. printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好. pr ...

  8. 六、Mosquitto 高级应用之SSL/TLS

    mosquitto提供SSL支持加密的网络连接和身份验证.本章节讲述次功能的实现. 在此之前需要一些准备工作. 准本工作: 一台 Linux 服务器. 安装好 openssl (不会明白怎么安装 op ...

  9. POJ1269:Intersecting Lines(判断两条直线的关系)

    题目:POJ1269 题意:给你两条直线的坐标,判断两条直线是否共线.平行.相交,若相交,求出交点. 思路:直线相交判断.如果相交求交点. 首先先判断是否共线,之后判断是否平行,如果都不是就直接求交点 ...

  10. 如何设计Spring读取某种文件的逻辑顺序

    1. 判断系统属性System.getProperty("apdb.config.path", "");,有的话,优先使用.(系统属性可以在命令行中以 -D&l ...