Check for None in Scala Option type isEmpty method

joesan picture joesan · Dec 30, 2013 · Viewed 50.2k times · Source

I'm using the Option Type's isEmpty method to check if there is no value. I do not want to use the case match as in my situation, I just want to check if there is None as I would throw an error to the caller. But the isEmpty method fails even though the value is None.

Here is what I tried!

val questionOption = Question.getQuestionForQuestionId(userExam.get.examId, currQuesId + 1)

if(questionOption.isEmpty) {
    Left(Failure(FailureCode.NO_DATA_FOUND, "Cannot get next exam question you tampered your cookie or cookie is lost.... >> TODO... modify the exception message"))
} 

It is not getting inside the if condition. I tried to do a println on the questionOption and it prints None. So wondering why I'm not getting inside the if condition.

Answer

wheaties picture wheaties · Dec 30, 2013

From the comment under the question, the real problem emerges:

 val questionOption = Question.getQuestionForQuestionId(userExam.get.examId, currQuesId + 1) 
 if(questionOption.isEmpty) { 
   Left(Failure(FailureCode.NO_DATA_FOUND, "Cannot get next exam question you tampered your cookie or cookie is lost.... >> TODO... modify the exception message")) 
 }

By itself, if returns type Unit so that your statement is returning nothing useful. If you want to return something you need to add in either an else which then returns the least upper bound of the result types. Hence

 >>> val yo = if(1 != 0) 4
 yo: Unit

 >>> val ya = if(1 != 0) Left(1) else Right("got it")
 ya: Either[Int, String]