scala学习手记26 - 重用函数值
函数值对消除代码重复有很大的帮助。但是像函数值这样直接将一个函数作为另一个函数的参数却不太利于函数值本身的重用。
来看一个例子:
class Equipment(val routine: Int => Int) {
def simulate(input: Int) = {
print("Running simulation...")
routine(input)
}
}
在这个例子里将函数值作为参数传到了构造器中。
看一下如何使用:
val equipment1 = new Equipment({input=>println("calc with " + input); input})
val equipment2 = new Equipment(input=>{println("calc with " + input); input}) equipment1.simulate(4)
equipment1.simulate(6)
执行结果如下:
上面的代码中还是出现了重复代码。新建实例equipment1和equipment2时,向Equipment构造函数中传递的函数值是一样的。要避免这样的函数值重复,可以将函数值赋给一个val,然后调用的时候直接使用val。就像下面这样:
val calculate = { input: Int => println("calc with " + input); input } val equipment1 = new Equipment(calculate)
val equipment2 = new Equipment(calculate) equipment1.simulate(4)
equipment1.simulate(6)
这里将函数值保存在一个val引用calculate中。请注意下,在这里需要声明函数值参数的类型。在之前是不需要的。那是因为scala可以推断出直接嵌入到函数中的函数值的参数类型。
实际上scala还支持一种更地道的方式:在需要函数值的地方可以传入普通函数。所以如下的代码也是可以的:
def calculate(input: Int) = {
println("calc with " + input)
input
} val equipment1 = new Equipment(calculate)
val equipment2 = new Equipment(calculate)
这样看起来更自然些,是不是。
就这样。
##########
scala学习手记26 - 重用函数值的更多相关文章
- scala学习手记23 - 函数值
scala的一个最主要的特性就是支持函数编程.函数是函数编程中的一等公民:函数可以作为参数传递给其他函数,可以作为其他函数的返回值,甚至可以在其它函数中嵌套.这些高阶函数称为函数值. 举一个简单的例子 ...
- scala学习手记24 - 多参数函数值
上一节的函数值只有一个参数.函数值当然也是可以有多个参数的.看一下下面的inject方法: def inject(arr: Array[Int], initial: Int, operation: ( ...
- scala学习手记38 - 方法命名约定和for表达式
方法命名约定 之前在学习<运算符重载>一节时曾经说过一个方法命名约定:方法的第一个字符决定了方法的优先级.现在再说另一个命名约定:如果方法以冒号(:)结尾,则调用目标是运算符后面的实例. ...
- scala学习手记39 - 模式匹配
在java中有switch/case这样的模式匹配语句,可以匹配的类型包括int,byte,char,short, enum,在java8又支持了字符串. 在scala中也有类似的模式匹配语句,即ma ...
- scala学习手记37 - 容器的使用
这次统一看一下scala中容器类的几个方法. Set filter()方法 filter()方法用来从Set中过滤获取含有指定特征的元素.示例代码如下: val colors1 = Set(" ...
- scala学习手记35 - 隐式类型转换
先来看一下下面的内容: 2 days "ago" 5 days "from_now" 如上的内容具体应该是什么呢?不过怎么看也不像是代码.不过既然是在学代码,拿 ...
- scala学习手记30 - 闭包
首先要弄白闭包的概念. 教材中的说法是:闭包是一种特殊的函数值,闭包中封闭或绑定了在另一个作用域或上下文中定义的变量.这里说闭包是一种特殊的函数值. 维基百科中的说法是:在计算机科学中,闭包(英语:C ...
- scala学习手记28 - Execute Around模式
我们访问资源需要关注对资源的锁定.对资源的申请和释放,还有考虑可能遇到的各种异常.这些事项本身与代码的逻辑操作无关,但我们不能遗漏.也就是说进入方法时获取资源,退出方法时释放资源.这种处理就进入了Ex ...
- scala学习手记27 - 下划线与参数
在Scala里,下划线(_)可以表示函数值的参数.如果某个参数在函数里仅使用一次,就可以用下划线表示.每次在函数里用下划线,都表示随后的参数. val arr = Array(1, 2, 3, 4, ...
随机推荐
- Less-minxin传参
//mixin传参 --简单传参,example: .border-radius(@radius) { -webkit-border-radius: @radius; -moz-border-radi ...
- Openstack虚拟机创建流程
续上一篇Openstack安装配置 一,keystone交互认证阶段 1,发送用户名和密码给keystone认证获取token 2,带着token访问nova-api 3,nova-api使用toke ...
- mysql source 执行sql脚本,中文变量不显示问题或乱码问题
执行脚本内容如下: SET @pre_version=2017080901; SET @cur_version=2017090401; SET @ver_desc = '测试脚本'; CALL pro ...
- python基础之类的静态方法和类方法
一 静态方法 通常情况下,在类中定义的所有函数都是对象的绑定方法,对象再调用绑定方法时会自动将自己作为参数传递给方法的第一个参数.除此之外还有两种常见的方法:静态方法和类方法,二者是为类量身定制的,但 ...
- django模板之导入与继承
组件 母版 子模板继承 2.静态文件相关 {% load static %} <link rel=-dist/css/bootstrap.css %}> <link rel=&quo ...
- 我的Android进阶之旅------>Android APP终极瘦身指南
首先声明,下面文字转载于: APK瘦身实践 http://www.jayfeng.com/2015/12/29/APK%E7%98%A6%E8%BA%AB%E5%AE%9E%E8%B7%B5/ APP ...
- DB2中编目本机其中数据库的方法
问题:同一节点上有两个实例.假设想在当中一个实例下訪问还有一个实例中的数据库,有两种方法: 1. 使用catalog local node的方式,在当中一个实例中将另外一个实例直接编目,这样的方试中, ...
- Hbase 学习笔记3----操作以及维护
一,基本命令: 建表:create 'table','t1','t2' 也可以建表时加coulmn的属性如:create 'table',{NAME => 't1', BLOOMFI ...
- ES6的十个新特性
这里只讲 ES6比较突出的特性,因为只能挑出十个,所以其他特性请参考官方文档: /** * Created by zhangsong on 16/5/20. */// ***********Nu ...
- day3-set集合
set是一个无序且不重复的元素集合 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 3 ...