scala中的高阶函数
版权申明:转载请注明出处。
文章来源:http://bigdataer.net/?p=332
排版乱?请移步原文获得更好阅读体验
1.scala中的函数
scala是一门面向对象和函数式编程相结合的语言,前面的文章已经讲了类、对象、继承等面向对象特有的语言特性,接下来将关注一下函数式编程的相关知识。在scala中,函数和变量一样,都是scala的一等公民。与函数相关的代码片段如下:
//定义一个匿名函数 (x:Int) => 3*x //将函数赋值给一个变量 val fun = (x:Int) => 3*x //将函数传递给一个方法或者函数时省略参数类型 map(x=>x*3)
2.高阶函数
正常的一个函数只能接受常量或者普通变量作为参数,但是高阶函数可以接受函数作为参数,同时高阶函数的返回值也可以是函数。比如常见的有map,filter,reduce等函数,它们可以接受一个函数作为参数。
3.闭包
仅从字面上来理解,很容易将闭包和包关联起来,其实不然。闭包是一种函数,函数的返回值依赖于声明在外部的一个或者多个变量,这里的返回值是指返回的函数。如:
//定义一个闭包 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的内部类去实现。如:
//传统写法 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中的高阶函数的更多相关文章
- Python 函数式编程 & Python中的高阶函数map reduce filter 和sorted
1. 函数式编程 1)概念 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念.wiki 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数 ...
- Python中的高阶函数与匿名函数
Python中的高阶函数与匿名函数 高阶函数 高阶函数就是把函数当做参数传递的一种函数.其与C#中的委托有点相似,个人认为. def add(x,y,f): return f( x)+ f( y) p ...
- JS中的高阶函数
JS中的高阶函数 高阶函数是指以函数作为参数的函数,并且可以将函数作为结果返回的函数. 1. 高阶函数 接受一个或多个函数作为输入 输出一个函数 至少满足以上一个条件的函数 在js的内置对象中同样存在 ...
- Java中的函数式编程(五)Java集合框架中的高阶函数
写在前面 随着Java 8引入了函数式接口和lambda表达式,Java 8中的集合框架(Java Collections Framework, JCF)也增加相应的接口以适应函数式编程. 本文的 ...
- ES6中的高阶函数:如同 a => b => c 一样简单
作者:Sequoia McDowell 2016年01月16日 ES6来啦!随着越来越多的代码库和思潮引领者开始在他们的代码中使用ES6,以往被认为是"仅需了解"的ES6特性变成了 ...
- JavaScript中的高阶函数
之前写的<JavaScript学习手册>,客户跟我说有些内容不适合初学者,让我删了,感觉挺可惜的,拿到这里和大家分享. JavaScript中的一切都是对象,这句话同样适用于函数.函数对象 ...
- javascript中的高阶函数, 和 类定义Function, 和apply的使用
参考: http://www.cnblogs.com/delin/archive/2010/06/17/1759695.html js中的类, 也是用function关键字来定义的: function ...
- python中的高阶函数
高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 以Python内置的求绝对值的函数abs()为例,调用该函数用以下 ...
- Javascript中的高阶函数介绍
高阶函数:高阶看上去就像是一种先进的编程技术的一个深奥术语,一开始我看到的时候我也这样认为的. Javascript的高阶函数 然而,高阶函数只是将函数作为参数或返回值的函数.以下面的Hello,Wo ...
随机推荐
- multi-paradigm
w范式 https://developer.mozilla.org/en-US/docs/Web/JavaScript https://developer.mozilla.org/zh-CN/docs ...
- angular(一)
angularjs第一章•angluarjs介绍·什么是angularjs•AngularJS 是一个为动态WEB应用设计的结构框架,提供给大家一种新的开发应用方式,这种方式可以让你扩展HTML的语法 ...
- git学习------>如何汉化GitLab?
在上一篇博客中,已经正常安装好了GitLab,然而全部界面都是纯英文的,为了照顾整个团队的英文水平,因此这篇博客的目的是将纯英文的GitLab进行汉化. 纯英文界面 第一步: 确认GitLab版本号 ...
- python小数据池,代码块的最详细、深入剖析
代码块: Python程序是由代码块构造的.块是 一个python程序的文本,他是作为一个单元执行的. 代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块. 而作为交互方式输入的每个命令都是 ...
- 003-shell 传递参数
一.概述 可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n.n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… 二.实例 以下实例我们向 ...
- jQuery中on()方法用法实例
这篇文章主要介绍了jQuery中on()方法用法,实例分析了on()方法的功能.定义及在匹配元素上绑定一个或者多个事件处理函数的使用技巧,需要的朋友可以参考下 本文实例讲述了jQuery中on()方法 ...
- Spark踩坑记:Spark Streaming+kafka应用及调优
前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark streaming从k ...
- PAT 1116 Come on! Let's C [简单]
1116 Come on! Let's C (20 分) "Let's C" is a popular and fun programming contest hosted by ...
- 马尔可夫随机场(Markov random fields) 概率无向图模型 马尔科夫网(Markov network)
上面两篇博客,解释了概率有向图(贝叶斯网),和用其解释条件独立.本篇将研究马尔可夫随机场(Markov random fields),也叫无向图模型,或称为马尔科夫网(Markov network) ...
- android 带CheckBox对话框
package com.example.dialog4; import android.os.Bundle;import android.app.Activity;import android.app ...