上一节的函数值只有一个参数。函数值当然也是可以有多个参数的。看一下下面的inject方法:

def inject(arr: Array[Int], initial: Int, operation: (Int, Int) => Int): Int = {
var carryOver = initial
arr.foreach(element => carryOver = operation(carryOver, element))
carryOver
}

在inject方法中有三个参数:一个数组、一个用来作为初始值的Int以及一个函数值。方法体也比较简单:遍历数组,使用数组元素参与函数值定义的操作。其中会将函数值操作结果取出再次参与运算。完成对数组的所有成员的运算后将结果返回。

看一下如何使用inject函数,如下演示了如何对数组元素求和:

val array = Array(2, 3, 5, 1, 6, 4)
val sum = inject(array, 0, (carryOver, elem) => carryOver + elem)
println("Sum of elements in array [" + array.mkString(",") + "] is " + sum)

inject()方法的第一个实参是一个数组,也就是想要求和的所有元素。第二个实参是求和的初始值0。第三个实参是执行元素求和操作的函数,一次一个。

输出如下:

执行数组求和可以,找出数组中的最大值也是可以的:

val array = Array(2, 3, 5, 1, 6, 4)
val sum = inject(array, array(0), (carryOver, elem) => Math.max(carryOver, elem))
println("Max of elements in array [" + array.mkString(",") + "] is " + sum)

输出如下:

实际上scala程序库已经内建了遍历数组的方法:foldLeft(),也是/:方法。下面是个例子,演示了如何使用/:方法执行上面的求和和找出最大值的操作:

val array = Array(2, 3, 5, 1, 6, 4)
val sum = (0 /: array) { (sum, elem) => sum + elem }
val max = (Integer.MIN_VALUE /: array) { (large, elem) => Math.max(large, elem) }
println("Sum of elements in array [" + array.mkString(",") + "] is" + sum)
println("Max of elements in array [" + array.mkString(",") + "] is" + max)

执行结果是:

不知道有没有注意到:这里在/:方法中使用函数值的方式与在inject方法中不一样——并没有将函数值作为参数,而是放到了花括号里。这并不表明inject方法也能这样使用。下面的代码就会报错:

val sum = inject(array, 0) {(carryOver, elem) => carryOver + elem}

报错信息如下:

这需要了解另一个概念:curry化。

下一节会说Curry化。

########

scala学习手记24 - 多参数函数值的更多相关文章

  1. scala学习手记30 - 闭包

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

  2. scala学习手记22 - 参数化类型的可变性

    java 的代码中多少有些不是很严谨的内容,比如下面的这段代码: public class Trouble { public static void main(String[] args) { Int ...

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

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

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

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

  5. scala学习手记26 - 重用函数值

    函数值对消除代码重复有很大的帮助.但是像函数值这样直接将一个函数作为另一个函数的参数却不太利于函数值本身的重用. 来看一个例子: class Equipment(val routine: Int =& ...

  6. scala学习手记21 - 传递变长参数

    在Java中是可以使用变长参数的,如下面的方法: public void check(String ... args){ for(String tmp : args){ System.out.prin ...

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

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

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

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

  9. scala学习手记2 - scala中的循环

    先来看一段Java中的循环: for (int i = 1; i < 4; i++) { System.out.print(i + ","); } 毫无疑问,scala可以让 ...

随机推荐

  1. python中 将字符串和字典的相互转换

    1.首先引入json模块 # 引入json模块 import json 2.转换 #JSON到字典转化: dictinfo = json.loads(json_str) # 输出dict类型 字典到J ...

  2. Oracle数据库模型(OLAP/OLTP)

    数据库模型 选择数据库模型: 联机事务处理OLTP(on-line transaction processing) OLTP是传统的关系数据库的主要应用,基本的.日常的事务处理.例如银行交易. OLT ...

  3. FW: Nginx模块开发入门

    前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Nginx在高并 ...

  4. swiper插件简介及用法

    swiper Swiper是纯javascript打造的滑动特效插件,面向手机.平板电脑等移动终端.Swiper能实现触屏焦点图.触屏Tab切换.触屏多图切换等常用效果.Swiper开源.免费.稳定. ...

  5. Java Concurrency In Practice

    线程安全 定义 A class is thread-safe if it behaves correctly when accessed from multiple threads, regardle ...

  6. js实现模糊查询

    1.简述 实现模糊查询方法有很多种,后端可以实现,前端使用js也可以实现. 后端实现起来需要根据输入框中搜索的关键字,去后台拼接SQL语句查询. 前端直接使用字符串的indexOf()方法或者正则表达 ...

  7. Django HttpResponse对象详解

    HttpResponse对象 Django服务器接收到客户端发送过来的请求后,会将提交上来的这些数据封装成一个HttpRequest对象传给视图函数.那么视图函数在处理完相关的逻辑后,也需要返回一个响 ...

  8. spawn 和 exec 的区别(转载)

    众所周知,Node.js在child_process模块中提供了spawn和exec这两个方法,用来开启子进程执行指定程序.这两个方法虽然目的一样,但是既然Node.js为我们提供了两个方法,那它们之 ...

  9. zookeer安装

    解压:tar xf zookeeper-3.4.9.tar.gz进入目录cd /opt/zookeeper-3.4.9/ 编辑配置文件:vim zoo.cfg# The number of milli ...

  10. iOS学习之七牛云存储应用

    前言 七牛云存储,是专为移动时代开发者打造的数据管理平台,为互联网网站和移动App提供数据的在线托管.传输加速以及图片.音视频等富媒体的云处理服务. 七牛云官网http://www.qiniu.com ...