2014-01-20 15 views
10

Ich suche nach einer Möglichkeit in scala, um eine Funktion aufzurufen und Option als Ergebnis zu erhalten, das "None" ist, wenn entweder eine Exception beim Aufruf der Methode ausgelöst wird oder die Methode null zurückgibt. Andernfalls sollte die Option den Wert des Ergebnisses haben.Try/Option mit null

Ich weiß, dass Try kann für den ersten Teil verwendet werden, aber ich weiß nicht, wie der zweiten Teil zu handhaben:

val result = Try(myFunction).toOption() 

Wenn die Methode jetzt null zurück (weil es keine scala Funktion ist aber eine Java-Funktion), result ist Some(null) statt None.

Antwort

20

Wie ich weiß, dass es nur 1-Methode in scala-Standardbibliothek ist null zu None zu konvertieren - Option.apply(x), so dass Sie es manuell verwenden müssen:

val result = Try(myFunction).toOption.flatMap{Option(_)} 
// or 
val result = Try(Option(myFunction)).toOption.flatten 

Sie könnten Ihre eigene Hilfsmethode wie folgt erstellen:

implicit class NotNullOption[T](val t: Try[T]) extends AnyVal { 
    def toNotNullOption = t.toOption.flatMap{Option(_)} 
} 

scala> Try(null: String).toNotNullOption 
res0: Option[String] = None 

scala> Try("a").toNotNullOption 
res1: Option[String] = Some(a) 
+0

Das sieht ordentlich aussieht. – tuxdna

+0

Kann das irgendwie verpackt werden, damit ich nicht so viele Dinge schreiben muss? – theomega

+1

@theomega: siehe Aktualisierung. – senia

0

Sie können auch Mustervergleich tun, wie:

val result = myFunction() match { 
    case null => None 
    case _ => Some(_) 
} 

aber die Antwort von @senia sieht mehr „scala Stil“

3

Sie dies auch tun können:

val result = Try(myFunction).toOption.filter(_ != null) 

die und fühlt sich besser als .flatten oder .flatMap(Option(_))