我正在阅读Spark
的源代码,并且不确定我是否了解这一行readFunction: (PartitionedFile) => InputPartitionReader[T]
。
问题:
readFunction
作为参数传递给案例类?此语法是否有特殊动机?
case class FileInputPartition[T](
file: FilePartition,
readFunction: (PartitionedFile) => InputPartitionReader[T],<-- This line
ignoreCorruptFiles: Boolean = false,
ignoreMissingFiles: Boolean = false)
extends InputPartition[T] {
override def createPartitionReader(): InputPartitionReader[T] = {
val taskContext = TaskContext.get()
val iter = file.files.iterator.map(f => PartitionedFileReader(f,
readFunction(f)))
FileInputPartitionReader(taskContext, iter, ignoreCorruptFiles,
ignoreMissingFiles)
}
override def preferredLocations(): Array[String] = {
FilePartitionUtil.getPreferredLocations(file)
}
}
答案 0 :(得分:3)
在Scala中,函数为first class objects。这意味着:
该语言支持将函数作为参数传递给其他函数,将其作为其他函数的值返回,并将其分配给变量或存储在数据结构中
在这种情况下,构造函数可以使用Function1[PartitionedFile, InputPartitionReader[T]]
。这里没有什么特别寻常的地方,在Scala中,函数作为参数无处不在,其中以collection
API最为突出。
实际上,这里是如何使用此功能的-导致map
超出集合:
file.files.iterator.map(f => PartitionedFileReader(f, readFunction(f)))
这种用法在很大程度上解释了动机。