tags:

views:

151

answers:

5

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.

+4  A: 

This seems reasonably clean to me:

o.map(4==).getOrElse(false)

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 = o.map(p).getOrElse(false)
}
David Winslow
What is the purpose of the '==' after the 4?
James Black
"`4==`" is a function that tests for equality with 4
Steve Gilham
Scala sugar. 4== is treated as an anonymous function of one argument in this case. More clearly (but more verbosely) might be: `o.map(4.==)` or `o.map(_ == 4)` or `o.map(x => x == 4)`. Key point here is that whatever you pass to Option.map() is only evaluated on non-None Options.
overthink
+3  A: 

How about this:

val o = Some(4)
o match {
  case Some(4) => true
  case _ => false
}
Randall Schulz
+1  A: 

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
Mitch Blevins
The second method fails to account for when o is None.
Marcus Downing
D'oh! Edited to reflect. Thanks!
Mitch Blevins
+5  A: 

You could also use:

if (o == Some(4)) //do something
oxbow_lakes
A: 
o.map(_ == 4).getOrElse(false)
Synesso