Scala高阶函数
1、作为参数的函数
函数可以作为一个参数传入到一个方法当中去
|
def main(args: Array[String]): Unit = { val myFunc1 =(x:Int) =>{ x * x } val myArray = Array(1,3,5,7,9).map(myFunc1) println(myArray.mkString(",")) } |
2、匿名函数
没有名字的函数即是匿名函数,我们可以通过函数表达式来设置匿名函数
|
def main(args: Array[String]): Unit = { val hiddenFunc = (x:Int,y:String) => x + y println(hiddenFunc) } |
3、高阶函数
1、能够接受函数作为参数的方法,叫做高阶函数
|
def main(args: Array[String]): Unit = { val func3:(Int,String) =>(String,Int)={ (x,y)=>(y,x) } def myMethod3(hello:(Int,String) => (String,Int)):Int ={ val resultFunc = hello(20,"hello") resultFunc._2 } println(myMethod3(func3)) } |
2、高阶函数同样可以返回一个函数类型
|
def main(args: Array[String]): Unit = { def myFunc4(x:Int) = (y:String) => y println(myFunc4(50)) } |
4、参数类型推断
|
def main(args: Array[String]): Unit = { val array = Array(1,2,3,4,5,6,7,8,9) //map当中需要传入一个函数,我们可以直接定义一个函数 array.map((x:Int) => x * 2 ) //进一步化简参数推断省去类型信息 array.map((x) => x * 2 ) //进一步化简单个参数可以省去括号 array.map( x => x * 2 ) //进一步化简如果变量只在=>右边只出现一次,可以用_来代替 array.map( 2 * _ ) } |
5、闭包与柯里化
柯里化是scala当中面向函数式编程导致的一种必然的结果,最终推导而来产生的一种现象
|
def main(args: Array[String]): Unit = { //柯里化的定义形式 def kery(x:Int)(y:Int):Int={ x + y } println(kery(3)(5)) //柯里化的推导过程,注意方法的返回值不要定义任何的返回值类型 val keryResult = (x:Int) => (y:Int) => {x + y} def keryMethod(x:Int) ={ (y:Int) => x+ y } println(keryMethod(20)) println(keryMethod(20)(10)) //注意,方法当中的函数,调用了方法的参数,就叫做闭包 } |
再来看一个案例
|
/** * 柯里化的应用,比较数组集合当中两个对应下标字符串是否相等 * @param args */ def main(args: Array[String]): Unit = { val a = Array("Hello", "World") val b = Array("hello", "world") println(a.corresponds(b)(_.equalsIgnoreCase(_))) } |
Scala高阶函数的更多相关文章
- scala高阶函数类型推断什么时候失效?
class TypeInfer(self: Int, other: Int) { def test(num: Int, word: String, fun1: (Int, Int) => Int ...
- Scala高阶函数与泛型
1. Scala中的函数 在Scala中,函数是“头等公民”,就和数字一样.可以在变量中存放函数,即:将函数作为变量的值(值函数). 2. scala中的匿名函数,即没有函数名称的函数,匿名函数常作为 ...
- Scala高阶函数实践
高阶函数主要有两种:一种是将一个函数当做另外一个函数的参数(即函数参数):另外一种是返回值是函数的函数.package sparkCore/** * Created by zhen on 2018/3 ...
- Scala高阶函数示例
object Closure { def function1(n: Int): Int = { val multiplier = (i: Int, m: Int) => i * m multip ...
- Scala中的构造器和高阶函数
构造器 在定义类时可以定义主构造器.主构造器可以同时声明字段. /** * 主构造器 * @author Administrator */ //在scala中,类和方法交织在一起 class Test ...
- Thinking in scala (6)----高阶函数----返回一个函数
在Thinking in scala (5)----高阶函数* 里面,我们演示了如何把一个函数作为参数传递给另外一个函数. 在本文里面,我们来演示函数式编程另外一个重要的特性:返回一个函数.首先来看这 ...
- Thinking in scala (5)----高阶函数*
高阶函数是函数式编程里面一个非常重要的特色,所谓的高阶函数,就是以其它函数作为参数的函数. 下面以一个小例子演示Scala的高阶函数特性,非常有意思,也非常强大. 首先看这么一个程序: code1: ...
- Scala - 快速学习08 - 函数式编程:高阶函数
函数式编程的崛起 函数式编程中的“值不可变性”避免了对公共的可变状态进行同步访问控制的复杂问题,能够较好满足分布式并行编程的需求,适应大数据时代的到来. 函数是第一等公民 可以作为实参传递给另外一个函 ...
- spark快速开发之scala基础之5高阶函数,偏函数,闭包
高阶函数 高阶函数就是将函数作为参数或者返回值的函数. object function { def main(args: Array[String]): Unit = { println(test(f ...
随机推荐
- Android组件--碎片(fragment)
1. 基本概念 参考资料:http://blog.csdn.net/lmj623565791/article/details/37970961/ 一.什么是事务: 事务是应用程序中一系列严密的操作,所 ...
- 利用jquery判断点是否在椭圆内
源码例子下载 : <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" ...
- 解决Genymotion下载device时较慢的问题
Genymotion添加device时,加载速度很慢: 简单方法处理如下: 1.首先找到如下目录文件名 打开后找到如下行,复制该地址直接使用迅雷等下载工具下载好该ova文件: 2.放置下载好的文件至对 ...
- MVC中学到的小知识(MVC中的跳转,传参)
1.mvc中视图中的href="XXX",这个XXX是控制器地址,不是另一个视图.(这里的href语句只能转向控制器,不能直接转向视图),如果要实现转向视图,可以先转到控制器,然后 ...
- 三、curator recipes之共享的可重入读写锁
简介 curator实现了跨JVM的可重入读写互斥锁.它使用zookeeper去进行加锁,所以指定相同路径的处理线程将会基于“公平锁”的机制去竞争锁资源. 读写锁包含了读锁.写锁两个,它们的互斥关系如 ...
- 微信小程序通过CODE换取session_key和openid
微信小程序的用户信息获取需要请求微信的服务器,通过小程序提供的API在小程序端获取CODE,然后将CODE传入到我们自己的服务器,用我们的服务器来换取session_key和openid. 小程序端比 ...
- docker 卸载
1首先搜索已经安装的docker 安装包 [root@localhost ~]# yum list installed|grep docker 或者使用该命令 [root@localhost ~]# ...
- asp.net WebService的一个简单示例
不同的系统之间经常会需要数据的交换对接,而Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范 ...
- Java 基础:数组
一.数组声明: int[] x; int x[]; 在Java中一般使用前者,机把int[]看做一个类型,C++中只能后者 二.数组初始化: 直接提供值: int[] x = {1, 3, 4}; i ...
- 04.CSS动画示例-->烟花
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...