函数值对消除代码重复有很大的帮助。但是像函数值这样直接将一个函数作为另一个函数的参数却不太利于函数值本身的重用。

来看一个例子:

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 - 重用函数值的更多相关文章

  1. scala学习手记23 - 函数值

    scala的一个最主要的特性就是支持函数编程.函数是函数编程中的一等公民:函数可以作为参数传递给其他函数,可以作为其他函数的返回值,甚至可以在其它函数中嵌套.这些高阶函数称为函数值. 举一个简单的例子 ...

  2. scala学习手记24 - 多参数函数值

    上一节的函数值只有一个参数.函数值当然也是可以有多个参数的.看一下下面的inject方法: def inject(arr: Array[Int], initial: Int, operation: ( ...

  3. scala学习手记38 - 方法命名约定和for表达式

    方法命名约定 之前在学习<运算符重载>一节时曾经说过一个方法命名约定:方法的第一个字符决定了方法的优先级.现在再说另一个命名约定:如果方法以冒号(:)结尾,则调用目标是运算符后面的实例. ...

  4. scala学习手记39 - 模式匹配

    在java中有switch/case这样的模式匹配语句,可以匹配的类型包括int,byte,char,short, enum,在java8又支持了字符串. 在scala中也有类似的模式匹配语句,即ma ...

  5. scala学习手记37 - 容器的使用

    这次统一看一下scala中容器类的几个方法. Set filter()方法 filter()方法用来从Set中过滤获取含有指定特征的元素.示例代码如下: val colors1 = Set(" ...

  6. scala学习手记35 - 隐式类型转换

    先来看一下下面的内容: 2 days "ago" 5 days "from_now" 如上的内容具体应该是什么呢?不过怎么看也不像是代码.不过既然是在学代码,拿 ...

  7. scala学习手记30 - 闭包

    首先要弄白闭包的概念. 教材中的说法是:闭包是一种特殊的函数值,闭包中封闭或绑定了在另一个作用域或上下文中定义的变量.这里说闭包是一种特殊的函数值. 维基百科中的说法是:在计算机科学中,闭包(英语:C ...

  8. scala学习手记28 - Execute Around模式

    我们访问资源需要关注对资源的锁定.对资源的申请和释放,还有考虑可能遇到的各种异常.这些事项本身与代码的逻辑操作无关,但我们不能遗漏.也就是说进入方法时获取资源,退出方法时释放资源.这种处理就进入了Ex ...

  9. scala学习手记27 - 下划线与参数

    在Scala里,下划线(_)可以表示函数值的参数.如果某个参数在函数里仅使用一次,就可以用下划线表示.每次在函数里用下划线,都表示随后的参数. val arr = Array(1, 2, 3, 4, ...

随机推荐

  1. bootstrap-datetimepicker 滚动错位问题

    问题:在页面上弹出控件的时候,滚动后面页面,时间控件就会错位. 解决方法1: 搜索bootstrap-datetimepicker.js里面的"show:"方法,在this.pla ...

  2. attributes["wv"].nodeValue

    w 获取自定义属性的值 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  3. 指定文件夹 指定文件后缀名 删除整个文件夹 git 冲突解决 create a new repository on the command line push an existing repository from the command line

    http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840038939c2 ...

  4. spring 整合mybatis找不到${jdbc.driverClass}

    1.检查是否设置了mapper扫描org.mybatis.spring.mapper.MapperScannerConfigurer类 在spring里使用org.mybatis.spring.map ...

  5. Angular学习笔记—路由(转载)

    创建路由 1.首先安装 Angular Router.你可以通过运行以下任一操作来执行此操作: yarn add @angular/router # OR npm i --save @angular/ ...

  6. Mark一下 mysql 误删除root用户的解决方法

    今天学习mysql用户管理,不小心将mysql.user表中的root用户给删掉了,然后就无法登录mysql了,网上找到了linux下的解决方法,我做了简单的修改,改成了我的windows版,恢复方法 ...

  7. vue之 node.js 的简单介绍

    一.什么是 node.js? 它是可以运行在JavaScript的服务平台 二.安装 1.node.js的特性 - 非阻塞IO模型 - 时间驱动 2.运用场景 - 高并发低业务 - 实时场景 - 聊天 ...

  8. Python基础、判断、循环、列表、字典,day1

    一.Python 简介 1.介绍 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标 ...

  9. (转)CTO的烦恼:为啥差距就这么大呢?

    话说胖哒是一只CTO,近来遇到了一些小烦恼… 胖哒表示这么多问题想想就头大啊! 一直听说用Docker解决问题不错,于是两个月前,胖哒不远万里来到DockerCon 16,打算向国外的Docker先行 ...

  10. 常用restful路由

    tax_categories GET /tax_categories(.:format) tax_categories#index POST /tax_categories(.:format) tax ...