我試圖做一些似乎應該在scala中有直接的語法/函數的東西。我只是不知道那是什麼。我試圖將包含的選項(如果它不是無)的值轉換爲另一種類型。將選項中的值轉換爲另一種類型
只要我想知道的代碼會是什麼,如果我想實現以下功能
def myFunc(inVal:Option[Double]):Option[BigDecimal] = {
//Code I need goes here
}
注:我沒有真正實現這個功能,它只是爲我演示一下最清晰的方式我需要
我試圖做一些似乎應該在scala中有直接的語法/函數的東西。我只是不知道那是什麼。我試圖將包含的選項(如果它不是無)的值轉換爲另一種類型。將選項中的值轉換爲另一種類型
只要我想知道的代碼會是什麼,如果我想實現以下功能
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
等)來轉換值,你應該使用其實現方法具在此容器上的d 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
,但它會使您的代碼非常不清楚。
def myFunc(inVal: Option[Double]): Option[BigDecimal] = inVal map { BigDecimal(_) }
或
def myFunc(inVal: Option[Double]): Option[BigDecimal] = inVal map { BigDecimal.apply }
它的工作原理,因爲選項是Functor
(在這個簡單的使用情況下,沒有單子招)
擴展@senia的和@Yann穆瓦桑「如果你想保留東西包裹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]
變爲空。
@ som-snytt:已更新,但我無法想象有人會嘗試使用'map'這種方式。 – senia
@senia真正有用的答案。我沒有將Option作爲另一個容器的概念,我真正想做的是改變容器的內容。真的有助於思考,希望能阻止我在將來陷入其他地方。 –
'Option'只是另一個M字... –