2014-02-05 85 views
2

我試圖做一些似乎應該在scala中有直接的語法/函數的東西。我只是不知道那是什麼。我試圖將包含的選項(如果它不是無)的值轉換爲另一種類型。將選項中的值轉換爲另一種類型

只要我想知道的代碼會是什麼,如果我想實現以下功能

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

注:我沒有真正實現這個功能,它只是爲我演示一下最清晰的方式我需要

回答

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

一般來說,如果你想在容器(OptionSeqListTryFuture等)來轉換值,你應該使用其實現方法具在此容器上的d map

方法map接受lambda(function)作爲參數並將此函數應用於所有元素。 map不應該改變元素的數量:mapSome永遠不會返回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,但它會使您的代碼非常不清楚。

+0

@ som-snytt:已更新,但我無法想象有人會嘗試使用'map'這種方式。 – senia

+0

@senia真正有用的答案。我沒有將Option作爲另一個容器的概念,我真正想做的是改變容器的內容。真的有助於思考,希望能阻止我在將來陷入其他地方。 –

+1

'Option'只是另一個M字... –

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

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

它的工作原理,因爲選項是Functor(在這個簡單的使用情況下,沒有單子招)

0

擴展@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]變爲空。

相關問題