2017-01-17 6 views
0

Sagen, ich habe:Zugriff Option Typ Mitglieder

case class User(
    id: Int, 
    firstName: String, 
    lastName: String, 
    age: Int, 
    gender: Option[String]) 

einen Optionswert deklarieren Ich tippe:

val x:Option[User] = Some(User(1,"x","x",13,Some("ss"))) 

wie ich x-Mitglieder zugreifen, zum Beispiel

x.age 

I erhalten Sie den folgenden Fehler mit der obigen Erklärung

error: value age is not a member of Option[User] 
    x.age 

Ist dies der Ferne möglich

+6

Sie sollten wahrscheinlich nicht offene Fragen für solche Dinge, die leicht gegoogelt werden kann. Nichtsdestotrotz, hier ist ein guter Artikel, der erklärt, wie man den Optionstyp von scala benutzt. Beachten Sie auch, es war das erste Ergebnis, das ich beim googeln gefunden "mit der Option" scala " http://danielwestheide.com/blog/2012/12/19/the-neophytes-guide-to-scala-part-5 -the-option-type.html –

+0

Ich habe diesen Artikel gelesen (ich bin eigentlich halbwegs dabei). Es gibt x.map (_. age), aber das gibt nur ein Some zurück. Ich möchte den tatsächlichen Elementtyp anstelle einer anderen Option. – zam

+1

"Wie greife ich auf die Mitglieder von x zu?" Diese Frage weist auf ein Missverständnis hin, was passiert. 'x' hat keine Benutzermitglieder. 'x' ist eine Option. Diese Option muss zuerst behandelt werden, bevor über 'Benutzer'-Mitglieder gesprochen wird. –

Antwort

0

Was Sie suchen ist Pattern-Matching. Damit können Sie den Typ Ihres x testen. Sie müssen einfach schreiben:

x match{ 
    case None => /* Your code if it's None */ 
    case Some(user) => /* Here user has type User, so you can call its methods */ 
} 
1

Eine alternative Möglichkeit zum Muster für den Abgleich von Daten aus einem Monade Abrufen flatMap ist verwenden:

x.flatMap(user => Option(user.age)) 
// res128: Option[Int] = Some(13) 

ich dies nur erkennen, nicht wirklich Ihre Frage beantworten, aber Ich werde es immer noch als Alternative hier lassen, es sei denn, es gibt unterschiedliche Meinungen.


Während oben Antwort zu verlassen, wie, ich glaube, eine idiomatische Weise Werte von Option zu erhalten, ist getOrElse:

x.map(_.age).getOrElse(0) 
// res140: Int = 13 

Oder get:

x.map(_.age).get 
// res141: Int = 13 
1

Studie der Scaladoc page for Option. Es gibt eine überraschende Anzahl von Verfahren, die konkrete Typen (d. H. Nicht-monadisch) zurückgeben. Beispiele umfassen fold, getOrElse, head, max, product, sum und viele mehr.

Es ist jedoch zu beachten, dass die meisten von diesen zur Laufzeit nicht sicher sind (wird ein Fehler ausgelöst, wenn sie auf einem None aufgerufen wird). Es empfiehlt sich, Methoden zu verwenden, die bei Aufruf einer None einen Standardwert liefern. (fold und getOrElse sind gut.)

2

So viele Antworten ... aus Gründen der Vollständigkeit, ich denke, eine coole Art, mit Optionen (und alle Monaden für die Angelegenheit) zu arbeiten, ist ein Verständnis zu verwenden.

for(user <- x) yield user.age 

Es wird auch für beliebige verschachtelte Optionen arbeiten, sagen:

case class Address(street: String, number: Option[Int]) 
case class User(name: String, addr: Option[Address]) 

val u = Some(User("foo", Some(Address("bar", Some(2))))) 

for(user <- u; addr <- user.addr; n <- addr.number) yield n 
Verwandte Themen