我正在尝试做一些看起来应该在 scala 中具有直接语法/功能的事情。我只是不知道那是什么。我正在尝试将 Option 的包含值(如果它不是 None)转换为另一种类型。
如果我想实现以下功能,我只是想知道代码是什么
def myFunc(inVal:Option[Double]):Option[BigDecimal] = {
//Code I need goes here
}
注意:我实际上并没有实现这个功能,它只是我展示我需要的最清晰的方式
我正在尝试做一些看起来应该在 scala 中具有直接语法/功能的事情。我只是不知道那是什么。我正在尝试将 Option 的包含值(如果它不是 None)转换为另一种类型。
如果我想实现以下功能,我只是想知道代码是什么
def myFunc(inVal:Option[Double]):Option[BigDecimal] = {
//Code I need goes here
}
注意:我实际上并没有实现这个功能,它只是我展示我需要的最清晰的方式
def myFunc(inVal: Option[Double]): Option[BigDecimal] =
inVal map {d => d: BigDecimal}
一般来说,如果你想在容器(Option
, Seq
, List
, Try
, Future
, 等)中转换值,你应该map
在这个容器上使用方法。
方法map
接受 lambda(函数)作为参数并将此函数应用于所有元素。map
不应该改变元素的数量:map
onSome
永远不会返回None
。
您可以使用方法BigDecimal.apply
转换Double
为BigDecimal
这样的:
BigDecimal(1.1)
// res0: scala.math.BigDecimal = 1.1
但是也有一个从Double
to的隐式转换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 }
它之所以有效,是因为 Option 是一个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
(带有 value 0.0
),以防原点Option[Double]
为空。