2017-11-10 11 views
0

スカラで2つのオプション[浮動小数点]を合計するにはどうすればよいですか?例えばスカラで2つのオプション[浮動小数点数]を合計する方法

+方法は、簡単な方法は

def add (opt1:Option[Float],opt2:Option[Float]) : Option[Float] = { 

    (opt1,opt2) match { 
    case (None,None) => None 
    case (None,[email protected](_)) => v 
    case ([email protected](_),None) => v 
    case (Some(v1),Some(v2)) => Some(v1+v2) 

} 

} 

、通話機能を作成している文字列

+1

有用であると思いますがhttps://stackoverflow.com/questionsを見てください/ 16319505/summing-up-two-options –

+3

あなたの例では、結果を 'Option [Float]'ではなく単純な 'Float'として取得したいと思われます。その場合、最も簡単な解決策は 'f1.getOrElse(0f)+ f2.getOrElse(0f)' – Kolmar

答えて

0

を期待するのでもちろん

Option[Float](1.5f) + None = 1.5f 
Option[Float](2.3f) + Option[Float](1.2f) = 3.5f 

、提供された例では動作しません。 追加(一部(1.5f)、なし)

1
val addOptions = (o1: Option[Float], o2: Option[Float]) => (o1, o2) match { 
    case (Some(v1), Some(v2)) => Some(v1 + v2) 
    case (None, [email protected](_)) => v 
    case ([email protected](_), None) => v 
    case (None, None) => None 
} 

addOptions(Some(1.2f), None) 
---- 
res3: Option[Float] = Some(1.2) 

、またはオプションの​​を使用して::

val addOptions = (o1: Option[Float], o2: Option[Float]) => 
    o1.fold(o2)(v1 => o2.fold(o1)(v2 => Some(v1 + v2))) 

その後、あなたはまた、リストを折るときに関数を渡すことによって、n個の項目を追加することができタプルにパターンマッチングによってどちらか。

val lst = List[Option[Float]](Some(1.5f), None, Some(2f)) 
lst.foldLeft(None: Option[Float]) { (acc, item) => 
    addOptions(acc, item) 
}  
あなたはまた、それのような catsライブラリ( https://github.com/typelevel/cats)か何かを使用することができ

import cats.implicits._ 

val a: Option[Float] = Some(2f) 
val b: Option[Float] = Some(2f) 
a |+| b 
---- 
res2: Option[Float] = Some(4.0) 

|+|がちょうど半群のために(https://en.wikipedia.org/wiki/Semigroup

0

をオペレータを組み合わせてあなたが取得するgetメソッドを使用することができますですnonEmpty Optionの値。 Optionが空の場合

scala> Option[Float](2.3f).get + Option[Float](1.2f).get 
res0: Float = 3.5 

は、それはjava.util.NoSuchElementExceptionをスローします。

scala> Option[Float](2.3f).get + Option.empty[Float].get 
java.util.NoSuchElementException: None.get 
    at scala.None$.get(Option.scala:349) 
    at scala.None$.get(Option.scala:347) 
    ... 29 elided 

ので、最も安全な方法は@Kolmarも

scala> Option[Float](2.3f).getOrElse(0f) + Option[Float](1.2f).getOrElse(0f) 
res2: Float = 3.5 

scala> Option[Float](2.3f).getOrElse(0f) + Option.empty[Float].getOrElse(0f) 
res3: Float = 2.3 

をコメントしているようgetOrElseを使用することです、私は答えは

+0

@Marcos Riosです。 –

関連する問題