• scala学习手记24


    上一节的函数值只有一个参数。函数值当然也是可以有多个参数的。看一下下面的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。第三个实参是执行元素求和操作的函数,一次一个。

    输出如下:

    image

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

    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)

    输出如下:

    image

    实际上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)

    执行结果是:

    image

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

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

    报错信息如下:

    image

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

    下一节会说Curry化。

    ########

  • 相关阅读:
    如何使用go module导入本地包
    gin-vue-admin 03 项目打包上线
    golang map转xml
    vim简明文档
    goframe gf-cli的使用
    supervisor 的安装与使用
    element Tree 树形控件
    gin-vue-admin开发教程 02 了解项目目录结构和代码执行的流程
    gin-vue-admin开发教程 01安装与启用
    oraclesql遇见的问题(一)
  • 原文地址:https://www.cnblogs.com/amunote/p/5705816.html
Copyright © 2020-2023  润新知