版权申明:转载请注明出处。
文章来源: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. mysql 创建函数ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_f

    mysql 创建函数的时候 报错 ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL D ...

  2. GlusterFS部署

    一.GlusterFS简介 PB级容量.高可用.读写性能.基于文件系统级别共享.分布式.无metadata(元数据)的存储方式. GlusterFS(GNU ClusterFile System)是一 ...

  3. Guid ToString 格式知多少?

    在日常编程中,Guid是比较常用的,最常见的使用就是如下所示: string id = Guid.NewGuid().ToString(); 这条语句会生成一个新的Guid并转成字符串,如下: // ...

  4. python全栈开发从入门到放弃之函数基础

    1.为什么要用函数#1.避免代码重用#2.提高代码的可读性 2.函数的定义def 函数名(参数1,参数2):    '''函数注释'''    print("函数体")    re ...

  5. 斩获新知——记一次reverse的实现过程

    最近学习C++,在实现reverse模板函数的时候,从一个小问题开始,在对这个问题的旁敲侧击当中带起了更多疑惑,顺藤摸瓜之后,尽管没有将诸多问题完美解答,但整个过程下来却也似有所获.最初的问题从使用C ...

  6. C# 将 HTML 转换为图片或 PDF

    首先是把 HTML 转换为图片. public partial class Form1 : Form { public Form1() { InitializeComponent(); } WebBr ...

  7. EasyUI合并行

    扩展一下 EasyUI   下面湿扩展EasyUI 合并行的方法 $.extend($.fn.datagrid.methods, { autoMergeCells: function (jq, fie ...

  8. 最好的 Xcode 自动生成版本号技术

    在 bloglovin ,我们使用自动生成版本号来设置Xcode,使当前的版本号为在Git活跃的分支上 的提交数.它一直正常工作着,但我们的技术也不是一帆风顺的. 糟糕的老方法 我们使用的技术是来自一 ...

  9. TOSCA自动化测试工具--How to modify windows

    1.页面窗口(高亮的部分是我们需要的所有窗口) 2.窗口可以任意拖拽到任何地方 3.窗口可以并列显示 任务栏点击按钮可以继续拖动 放到自己想放的地方 4.收起preview,调整宽窄 5.保存当前wi ...

  10. 用random模块实现验证码

    #! /usr/bin/env python3 import random checkcode = "" ## 全部为数字的验证码 # for i in range(4): # c ...