4

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

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

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

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

4

3 回答 3

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

一般来说,如果你想在容器(Option, Seq, List, Try, Future, 等)中转换值,你应该map在这个容器上使用方法。

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

您可以使用方法BigDecimal.apply转换DoubleBigDecimal这样的:

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

但是也有一个从Doubleto的隐式转换BigDecimal,所以你可以像这样指定所需的类型:

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

val bd: BigDecimal = 1.2

PS:类型推断允许你使用d => d而不是d => d: BigDecimal这里,但是它会让你的代码很不清楚。

于 2014-02-05T19:09:21.430 回答
2
def myFunc(inVal: Option[Double]): Option[BigDecimal] = inVal map { BigDecimal(_) }

或者

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

它之所以有效,是因为 Option 是一个Functor(在这个简单的用例中没有一元技巧)

于 2014-02-05T19:45:43.787 回答
0

扩展@senia@Yann Moisan的答案,如果您想在转换阶段Option[]仍然提供默认值(可能是框架中的要求),将某些东西包裹在里面,您可以使用它:

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

它不仅会将您转换Option[Double]Option[BigDecimal],而且还会创建一个默认值 BigDecimal(带有 value 0.0),以防原点Option[Double]为空。

于 2018-02-26T11:45:32.900 回答