函数调用后的括号

Joh*_*ass 1 scala apache-spark

我是 Scala 的新手,我正在阅读这段代码。

我理解第一个val bucketizers是作为变量的函数,并val newCols称为bucketizers.

但是,我不明白为什么在bucketizers(idx)(filteredDataset(inputCol).cast(DoubleType))函数调用之后有一个括号bucketizers(idx)。我查了一些高级主题,包括闭包、高阶函数和链函数调用,但我认为我没有找到答案。

问题:这个括号叫什么?我们可以用另一种方式重写它吗?

代码:

val bucketizers: Seq[UserDefinedFunction] = seqOfSplits.zipWithIndex.map { case (splits, idx) =>
      udf { (feature: Double) =>
        Bucketizer.binarySearchForBuckets(splits, feature, keepInvalid)
      }.withName(s"bucketizer_$idx")
    }


    val newCols = inputColumns.zipWithIndex.map { case (inputCol, idx) =>
      bucketizers(idx)(filteredDataset(inputCol).cast(DoubleType))
    }
Run Code Online (Sandbox Code Playgroud)

And*_*kin 5

一步步:

  • 该变量bucketizers包含一个类型为 的序列Seq[UserDefinedFunction]
  • 因此,对于每个索引idx: Int,表达式 bucketizers(idx)是一个UserDefinedFunction
  • 如果fUserDefinedFunction,而且x是合适的参数,那么你可以调用传递函数x的参数如下:f(x)
  • 例如,你可以调用bucketizers(idx)(x)x = filteredDataset(inputCol).cast(DoubleType)

这里再次将所有部分组合为 ASCII 艺术:

bucketizers(idx)(filteredDataset(inputCol).cast(DoubleType))
\______________/^\________________________________________/^
  function      |               argument                   |
                |                                          |
           open parens for argument                   close parens
Run Code Online (Sandbox Code Playgroud)

这是一个仅使用基本语法的玩具示例:

val inputColumns = List(
  List(1, 2, 3, 4, 5, 6),   // first "column"
  List(4, 6, 5, 7, 12, 15)  // second "column"
)

type UDF = Function[List[Int], List[Int]]

val bucketizers: Seq[UDF] = List(
  _.map(_ * 42),              // first "UDF"
  _.map(_  % 3)               // second "UDF"
)

println(bucketizers(0)(List(1, 100))) // 42, 4200
println(bucketizers(1)(List(1,2,3,4))) // 1,2,0,1

val modifiedTable = inputColumns.zipWithIndex.map{ case (col, idx) =>
  bucketizers(idx)(col)
}

println(modifiedTable)
// Output:
// List(
//   List(42, 84, 126, 168, 210, 252), // first column times 42
//   List(1, 0, 2, 1, 0, 0)            // second column modulo 3
// )
Run Code Online (Sandbox Code Playgroud)

在这里,我们声明了一个包含两列的“表”和一个函数列表。然后我们将每个函数应用到相应的列。