Reputation: 756
How do I sum two Option[Float] in Scala?
For example:
Option[Float](1.5f) + None = 1.5f
Option[Float](2.3f) + Option[Float](1.2f) = 3.5f
Of course, the provided example doesn't work since +
method expects a String
Upvotes: 0
Views: 1773
Reputation: 23
The cats library would make things so much easier in this case but just in case you cannot use it here's a viable alternative:
def reduce(v1: Option[Float], v2: Option[Float]): Option[Float] =
v1.flatMap( x => v2.map(y => x + y).orElse(v1))
def sum(v1: Option[Float], v2: Option[Float]): Option[Float] = {
if(v1.isDefined)
reduce(v1, v2)
else
reduce(v2, v1)
}
You simply call sum to add two Floats:
sum(Some(22),Some(22))
You could also simply use a for-comprehension
Upvotes: 0
Reputation: 41957
You can use get
method to get the value of nonEmpty Option
.
scala> Option[Float](2.3f).get + Option[Float](1.2f).get
res0: Float = 3.5
If the Option
is empty then it throws 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
So the safest way is to use getOrElse
as @Kolmar has also commented
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
I hope the answer is helpful
Upvotes: 1
Reputation:
Either by pattern matching on the tuple:
val addOptions = (o1: Option[Float], o2: Option[Float]) => (o1, o2) match {
case (Some(v1), Some(v2)) => Some(v1 + v2)
case (None, v@Some(_)) => v
case (v@Some(_), None) => v
case (None, None) => None
}
addOptions(Some(1.2f), None)
----
res3: Option[Float] = Some(1.2)
, or using Option's .fold
:
val addOptions = (o1: Option[Float], o2: Option[Float]) =>
o1.fold(o2)(v1 => o2.fold(o1)(v2 => Some(v1 + v2)))
Then you can also add n items by passing the function when folding a list.
val lst = List[Option[Float]](Some(1.5f), None, Some(2f))
lst.foldLeft(None: Option[Float]) { (acc, item) =>
addOptions(acc, item)
}
You could also use cats
library (https://github.com/typelevel/cats) or something like it:
import cats.implicits._
val a: Option[Float] = Some(2f)
val b: Option[Float] = Some(2f)
a |+| b
----
res2: Option[Float] = Some(4.0)
|+|
is just the combine operator for Semigroups (https://en.wikipedia.org/wiki/Semigroup)
Upvotes: 1
Reputation: 385
The simple way is create a function
def add (opt1:Option[Float],opt2:Option[Float]) : Option[Float] = {
(opt1,opt2) match {
case (None,None) => None
case (None,v@Some(_)) => v
case (v@Some(_),None) => v
case (Some(v1),Some(v2)) => Some(v1+v2 )
}
}
and call with add(Some(1.5f),None)
Upvotes: 0