Marcos
Marcos

Reputation: 756

How to sum two Option[Float] in scala

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

Answers (4)

Kamau
Kamau

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

Ramesh Maharjan
Ramesh Maharjan

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

user804690
user804690

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

Rachid Ait Abdesselam
Rachid Ait Abdesselam

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

Related Questions