Как определить функцию в Scala для flatMap - PullRequest
0 голосов
/ 15 октября 2018

Впервые в Scala, я хочу попробовать переписать некоторый код в flatMap, вызвав функцию вместо записи всего процесса внутри "()".

Исходный код выглядит так:

val longForm = summary.flatMap(row => {
   /*This is the code I want to replace with a function*/
   val metric = row.getString(0)
   (1 until row.size).map{i=>
     (metric,schema(i).name,row.getString(i).toDouble)
    })
}/*End of function*/)

Функция, которую я написал:

def tfunc(line:Row):List[Any] ={
     val metric = line.getString(0)
     var res = List[Any] 
     for (i<- 1 to line.size){
       /*Save each iteration result as a List[tuple], then append to the res List.*/
      val tup = (metric,schema(i).name,line.getString(i).toDouble)
      val tempList = List(tup)
      res = res :: tempList
      }
     res
    }

Функция не прошла компиляцию со следующей ошибкой:

ошибка: отсутствует список аргументов для метода, применяемого в объекте ListНеприменимые методы преобразуются в функции только тогда, когда ожидается тип функции.Вы можете сделать это преобразование явным, написав apply _ или apply(_) вместо apply.var res = List [Any]

Что не так с этой функцией?А для flatMap это способ записи, чтобы вернуть результат в виде списка?

1 Ответ

0 голосов
/ 15 октября 2018

Вы не объяснили , почему вы хотите заменить этот блок кода.Есть ли конкретная цель, которую вы преследуете?Существует много, много разных способов, которыми блок может быть переписан.Как мы можем узнать, что будет лучше для удовлетворения ваших требований?

Вот один из подходов.

def tfunc(line :Row) :List[(String,String,Double)] ={
  val metric = line.getString(0)
  List.tabulate(line.tail.length){ idx =>
    (metric, schema(idx+1).name, line.getString(idx+1).toDouble)
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...