Как создать список списков заданного типа, размер которого может варьироваться в зависимости от входных данных? - PullRequest
0 голосов
/ 10 ноября 2019

Мне нужно создать функцию, которая возвращает List [List [Option [Double]]], где функция принимает List [String] символов фондового рынка и диапазон лет, на которые функция должна смотреть, поэтомучто-то вроде Range [2000, 2019, 1].

Функция вызовет другую функцию:

def price(symbol: String, year: Int) : Option[Double] = ... 

Возвращает Option [Double] либо Some (double), либо None. Допустим, функция, которую я пытаюсь создать, принимает List ("GOOG", "AAPL") и Range [2010, 2013, 1], результаты должны выглядеть примерно так:

List(List(Option for Google 2010, Option for Apple 2010),   
     List(Option for Google 2011, Option for Apple 2011),   
     List(Option for Google 2012, Option for Apple 2012)).  

Я неразрешено использовать 'var' в моем коде, только 'val' и, конечно, это означает, что после объявления не может быть никаких изменений.

Итак, я спрашиваю, как мне создать этот список [List [Option [Double]]], когда я не знаю, сколько значений будет в List [String] или Range. Я предполагаю, что это не возможно поставить точку в цикле for, и все это должно происходить во время объявления списка.

Пока что единственное, о чем я могу думать, это сделать что-то построки:

val returnList : List[List[Option[Double]]] = List(x => rangeIn.foreach(List(y => symbolsIn.foreach(price(y, x)))))

Ответы [ 2 ]

1 голос
/ 10 ноября 2019

@ ответ четвертой птицы - путь.

Но вы спросили, возможно ли это в цикле for. В scala вы редко видите традиционные циклы for и обычно используете для понимания. Он не выглядит так же хорошо, как другой ответ, но это возможно.

Он десугарсует почти к тому же коду, за исключением небольшого переноса.

val prices = (for {
    s <- List(symbols)
    r <- range
} yield s.flatMap(price(_, r)))
1 голос
/ 10 ноября 2019

Вы можете использовать map вместо foreach, который имеет тип возврата Unit.

Например:

val returnList : List[List[Option[Double]]] =
  rangeIn.map(r => symbolsIn.map(s => price(s, r)))

Scala demo

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