Вернуться в список параметров - PullRequest
0 голосов
/ 28 июня 2018

Я читаю исходный код Spark, и я не уверен, что понимаю эту строку readFunction: (PartitionedFile) => InputPartitionReader[T].

Вопросы:

  1. То есть мы можем передать метод readFunction в качестве параметра в класс case?
  2. Есть ли для этого терминология?
  3. Существуют ли какие-либо особые мотивы для этого синтаксиса?

    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)
    }
    }
    

1 Ответ

0 голосов
/ 28 июня 2018

В Scala используются объекты первого класса . Это означает, что:

язык поддерживает передачу функций в качестве аргументов другим функциям, возврат их в качестве значений из других функций и присвоение их переменным или сохранение их в структурах данных

В этом случае конструктор может принять Function1[PartitionedFile, InputPartitionReader[T]]. Здесь нет ничего особенно необычного, и функции в качестве аргументов вездесущи в Scala, с наиболее ярким примером collection API.

А на самом деле это то, как здесь используется функция - map по коллекции:

file.files.iterator.map(f => PartitionedFileReader(f, readFunction(f)))

Это использование в значительной степени объясняет мотивацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...