我正在尝试做一些似乎应该在scala中具有直接语法/功能的东西。我只是不知道那是什么。我正在尝试将Option的包含值(如果它不是None)转换为另一种类型。
如果我想实现以下功能,我想知道代码是什么
def myFunc(inVal:Option[Double]):Option[BigDecimal] = {
//Code I need goes here
}
注意:我实际上并没有实现这个功能,它只是我演示我需要的最清晰的方式
答案 0 :(得分:12)
def myFunc(inVal: Option[Double]): Option[BigDecimal] =
inVal map {d => d: BigDecimal}
一般情况下,如果要转换容器中的值(Option
,Seq
,List
,Try
,Future
等),您应该使用方法map
在此容器上。
方法map
接受lambda(function)作为参数,并将此函数应用于所有元素。 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
,但这会使您的代码非常不清楚。
答案 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技巧)