Scala之旅-高阶函数
2016-04-06 17:36
232 查看
1.函数作为参数
对某对象进行什么样的操作暂时保留,之后让你来定义。这类似于Java中的内部类机制,如果你熟悉C#的委托,这就再也简单不过了。
2.函数作为返回值
3.闭包
具体什么是闭包,这篇文章说的很详细:http://developer.51cto.com/art/200907/138439.htm
简单粗暴:一个变量在函数(lamda表达式)中使用 (呵呵,我在用委托避免参数传递时,经常这样做)
4.柯里化
之前看柯里化总是云里雾里,但是在看完函数作为参数和闭包后,总茅塞顿开了。
简单来说,柯里化就是一个函数作为参数的简写。 套用2中的例子
其实add01还可以简写如下
5.抽象控制
神马叫抽象控制? 说白了就是把函数做为参数或者返回值。下面看下scala中使用java线程的案例
第1版:
第2版,如果作为参数的函数是无参的类型,可以简写如下
Tip:调用runInThread或runInThread01的时候,我使用的都是 runInThread(.....),因为本人之前习惯了C#的lamda表达式的写法,书上的写法是runInThread{.....}
对某对象进行什么样的操作暂时保留,之后让你来定义。这类似于Java中的内部类机制,如果你熟悉C#的委托,这就再也简单不过了。
//1.函数作为参数 //对a具体进行什么操作不知道,让fun来完成 def getResult(fun: Int => Int, a: Int): Int = { fun(a) } def mul(x: Int) = 2 * x def demo01(): Unit = { //使用声明的函数---1040 println(getResult(mul, 520)) //使用匿名函数(lamda表达式)----521 println(getResult(x => x + 1, 520)) }
2.函数作为返回值
//2.函数作为返回值 def add01(a:Int)=(b:Int)=>a+b //注意a def demo02(): Unit ={ val add02=add01(5) //add01返回一个函数b=>5+b println(add02(3)) //结果:8 为什么5被留下来,涉及到闭包 }
3.闭包
具体什么是闭包,这篇文章说的很详细:http://developer.51cto.com/art/200907/138439.htm
简单粗暴:一个变量在函数(lamda表达式)中使用 (呵呵,我在用委托避免参数传递时,经常这样做)
def demo03(): Unit ={ val more=1 val add=(x:Int)=>x+more //more是函数外的东西 println(add(1)) }
4.柯里化
之前看柯里化总是云里雾里,但是在看完函数作为参数和闭包后,总茅塞顿开了。
简单来说,柯里化就是一个函数作为参数的简写。 套用2中的例子
//2.函数作为返回值 def add01(a:Int)=(b:Int)=>a+b //注意a def demo02(): Unit ={ val add02=add01(5) //add01返回一个函数b=>5+b println(add02(3)) //结果:8 为什么5被留下来,涉及到闭包 }其等价的柯里化
//柯里化 def demo04(): Unit ={ //其实就是把demo2的中间参数省略了 add01(5)还是一个函数 println(add01(5)(3)) //8 }
其实add01还可以简写如下
def add01(a:Int)(b:Int)=a+b
5.抽象控制
神马叫抽象控制? 说白了就是把函数做为参数或者返回值。下面看下scala中使用java线程的案例
第1版:
//使用java里面的线程,无缝结合 def runInThread(fun: () => Unit): Unit = { //参数是一个函数,它没有参数和返回值 new Thread() { override def run(): Unit = { fun() } }.start() //完全是java的内容 } //测试代码,无规则交替输出了T1 T2 T3的相应值 def demo(): Unit ={ for (i <- 1 to 3) runInThread(() => { Range(1, 100).foreach(x => println("T" + i + " " + x)) }) }
第2版,如果作为参数的函数是无参的类型,可以简写如下
def runInThread01(fun: => Unit) { //这里去掉了() new Thread() { override def run(): Unit = { fun } }.start() } def main(args: Array[String]) { for (i <- 1 to 3) runInThread01 ( Range(1, 100).foreach(x => println("T" + i + " " + x)) //这里去掉了() => {} ) }
Tip:调用runInThread或runInThread01的时候,我使用的都是 runInThread(.....),因为本人之前习惯了C#的lamda表达式的写法,书上的写法是runInThread{.....}
相关文章推荐
- 手机抓包方法
- 052(二十一)
- 四则运算终极版 (补充)
- 面试题,简单指针的指向
- python curses addrstr中文乱码问题
- VNCViewerWindows下远程连接Linux桌面
- 做了三个简单的题目
- LeetCode *** 242. Valid Anagram
- 全局变量和局部变量在内存里的区别
- 关于java
- Ruby On Rails--rake 任务中定义方法的陷阱
- SQLserver中用convert函数转换日期格式
- IOS开发之——reveal 的使用
- 企业运维监控平台架构设计与实现(ganglia篇)
- NSLog格式化标识符
- sql server 2008表值函数的使用
- JDK8新特性
- Java异常处理机制 try-catch-finally
- Java异常处理机制 try-catch-finally
- Sqoop安装与学习