博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
scala学习手记24 - 多参数函数值
阅读量:6953 次
发布时间:2019-06-27

本文共 1518 字,大约阅读时间需要 5 分钟。

上一节的函数值只有一个参数。函数值当然也是可以有多个参数的。看一下下面的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化。

########

转载于:https://www.cnblogs.com/amunote/p/5705816.html

你可能感兴趣的文章
当当网资深DBA:DB运维四大现代化的实现
查看>>
轻松搞定实时分析及监控大屏
查看>>
Spark应用(app jar)发布到Hadoop集群的过程
查看>>
OAuth 2.0 认证的原理与实践
查看>>
selenium 和 phantomJS或chrome浏览器抓取渲染网页
查看>>
提高iOS性能的建议和技巧
查看>>
FreeNAS+ESXi5数据丢失的恢复方法
查看>>
排序算法之耐心排序
查看>>
struts2拦截器 默认拦截器 默认跳转 全局异常
查看>>
首席DBA用SQL洪荒之力,造一把通向数据库的钥匙
查看>>
myEclipse中配置maven
查看>>
SOAP webserivce 和 RESTful webservice 对比及区别
查看>>
OC第一天——面向对象
查看>>
.NET中的六个重要概念:栈、堆、值类型、引用类型、装箱和拆箱
查看>>
Redis的Pub/Sub模式
查看>>
Maven中<dependencies>节点和<dependencyManagement>节点的区别
查看>>
.NET中异常处理的最佳实践(译)
查看>>
vim编辑器使用
查看>>
Hibernate4.3在开发中的一些异常总结(持续更新)
查看>>
DedeCMS中用到的字符编码转换1
查看>>