Idiom for Scala's Option when doing equality tests

0 votes
asked Nov 24, 2009 by trenton

What's an easier/cleaner way to do this?

val o = Some(4)
if(o.isDefined) {o.get == 4} else { false }

I've tried

o.getOrElse(null) == 4

but that feels wrong, since in the isEmpty case, you end up testing null against the other side... which could itself be null. I need it to be if opt is defined && opt.get == whatever. I feel like some method on Option should just take a function, and I could do it like so:

o.test( (x) => x == 4 )

and it would apply the function only if o.isDefined.

7 Answers

0 votes
answered Nov 24, 2009 by david-winslow

This seems reasonably clean to me:

If you want, you could even add an implicit conversion to add a convenience method for this:

implicit def richOption[A](o: Option[A]) = new {
  def test(p: A => Boolean): Boolean =
0 votes
answered Nov 24, 2009 by randall-schulz

How about this:

val o = Some(4)
o match {
  case Some(4) => true
  case _ => false
0 votes
answered Nov 24, 2009 by mitch-blevins

The following seems most intuitive to me, if you don't care about the object creation overhead.

val o = Some(4)
Some(4) == o

Another unsuggested method

val o = Some(4)
val Some(x) = o; x==4 // Edit: will not compile of o = None
0 votes
answered Nov 24, 2009 by oxbow-lakes

You could also use:

if (o == Some(4)) //do something
0 votes
answered Nov 24, 2009 by synesso == 4).getOrElse(false)
0 votes
answered Nov 22, 2014 by rok-kralj

This is the cleanest, most idiomatic way to do it.

val o = Some(4)
o.contains(4) // true
o.contains(5) // false

There is also a predicate version of this:

val o = Some(4)
o.exists(_ > 0) // true
o.exists(_ > 100) // false

Only use the predicate version if contains is not strong enough.

0 votes
answered Nov 11, 2015 by iurii-perevertailo

Try this:

val o = Some(4)
o.exists(4 == _)
Welcome to Q&A, where you can ask questions and receive answers from other members of the community.
Website Online Counter