Преобразовать значение в опции в другой тип
Я пытаюсь сделать что-то, что должно иметь прямой синтаксис / функцию в 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]
оказывается нулевым.