将Option中的值转换为另一种类型

时间:2014-02-05 19:06:41

标签: scala scala-option

我正在尝试做一些似乎应该在scala中具有直接语法/功能的东西。我只是不知道那是什么。我正在尝试将Option的包含值(如果它不是None)转换为另一种类型。

如果我想实现以下功能,我想知道代码是什么

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

注意:我实际上并没有实现这个功能,它只是我演示我需要的最清晰的方式

2 个答案:

答案 0 :(得分:12)

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

一般情况下,如果要转换容器中的值(OptionSeqListTryFuture等),您应该使用方法map在此容器上。

方法map接受lambda(function)作为参数,并将此函数应用于所有元素。 map不应更改元素数量:map上的Some永远不会返回None

您可以使用方法BigDecimal.applyDouble转换为BigDecimal,如下所示:

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

但是也存在从DoubleBigDecimal的隐式转换,因此您可以像这样指定所需的类型:

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

val bd: BigDecimal = 1.2

PS:类型推断允许您在此处使用d => d而不是d => d: BigDecimal,但这会使您的代码非常不清楚。

答案 1 :(得分:2)

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

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

它有效,因为Option是Functor(在这个简单的用例中没有monadic技巧)