Reputation: 11996
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.
Upvotes: 15
Views: 12115
Reputation: 48765
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.
Upvotes: 24
Reputation: 13196
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
Upvotes: 2
Reputation: 26486
How about this:
val o = Some(4)
o match {
case Some(4) => true
case _ => false
}
Upvotes: 5
Reputation: 8590
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)
}
Upvotes: 7