Преобразовать значение в опции в другой тип

Я пытаюсь сделать что-то, что должно иметь прямой синтаксис / функцию в Scala. Я просто не знаю что это. Я пытаюсь преобразовать содержащееся в нем значение параметра (если оно не None) в другой тип.

Просто я хочу знать, каким был бы код, если бы я хотел реализовать следующую функцию

def myFunc(inVal:Option[Double]):Option[BigDecimal] = {
    //Code I need goes here
}

Примечание: я на самом деле не реализую эту функцию, это просто самый простой способ продемонстрировать, что мне нужно

3 ответа

Решение
def myFunc(inVal: Option[Double]): Option[BigDecimal] =
  inVal map {d => d: BigDecimal}

В общем, если вы хотите преобразовать значение в контейнер (Option, Seq, List, Try, Futureи т. д.) вы должны использовать метод map на этом контейнере.

метод map принимает лямбда (функцию) в качестве параметра и применяет эту функцию ко всем элементам. map Не следует изменять количество элементов: map на Some никогда не вернется None,

Вы могли бы использовать метод BigDecimal.apply преобразовать Double в BigDecimal как это:

BigDecimal(1.1)
// res0: scala.math.BigDecimal = 1.1

Но есть также неявное преобразование из Double в BigDecimalтак что вы можете просто указать желаемый тип следующим образом:

1.1: BigDecimal
// res0: scala.math.BigDecimal = 1.1

val bd: BigDecimal = 1.2

PS: вывод типа позволяет использовать d => d вместо d => d: BigDecimal здесь, но это сделает ваш код очень неясным.

def myFunc(inVal: Option[Double]): Option[BigDecimal] = inVal map { BigDecimal(_) }

или же

def myFunc(inVal: Option[Double]): Option[BigDecimal] = inVal map { BigDecimal.apply }

Это работает, потому что вариант является Functor (нет монадического трюка в этом простом случае использования)

Расширяя ответы @senia и @Yann Moisan, если вы хотите сохранить что-то внутри Option[] продолжая указывать значение по умолчанию на этапе преобразования (это может быть требованием в вашей среде), вы можете использовать это:

def myFunc(inVal: Option[Double]): Option[BigDecimal] = {
  Some(inVal.map(BigDecimal(_)).getOrElse(BigDecimal(0.0)))
}

Это не только преобразовать ваши Option[Double] в Option[BigDecimal] но и создать по умолчанию BigDecimal (со значением 0.0 в случае происхождения Option[Double] оказывается нулевым.

Другие вопросы по тегам