Ich bin nicht sicher, wo genau das Problem in Ihrem Code ist, aber ich werde die üblichen Wege decken zu Deal mit Option
. Option
löst das gleiche Problem, das Java null
löst, aber es ist in einer Weise, die um Größenordnungen besser, sicherer und einfacher ist, mit zu arbeiten. Also werde ich hier mit einer hypothetischen Funktion arbeiten, die gerade eine Option[A]
erhalten hat. Die Frage, die Sie sich stellen müssen, lautet: Was bedeutet es, wenn ich eine None
bekomme? Scala zwingt Sie, diese Frage zu stellen, wo alle implizit nullbaren Klassenarten (wie in Java) nicht gemacht werden.
Option 1: Die Fehler Propagieren Ruhig
Vielleicht None
zeigt einen Fehler an der Stelle, wo wir die A
von bekam. Etwas ist schiefgelaufen, der Zufallsgenerator ist gescheitert, vielleicht haben wir ihn durch Null geteilt. Dann wollen wir anzeigen, dass wir versagt haben. In diesem Fall ändern wir den Rückgabetyp unserer Funktion von A
in Option[A]
und geben eine None
zurück.
In Java würde dies so aussehen.
if (arg == null)
return null;
return doSomething(arg);
In Scala,
arg map { x => doSomething(x) }
Wenn arg
ist None
, gibt diese None
. Wenn arg
einen Wert enthält, wird doSomething
für den Wert ausgeführt und das Ergebnis wird in einem Option[A]
zurückgegeben.
Option 2: None
zeigt ein anderes Verhalten
Vielleicht None
gibt an, in gewissem Sinne, dass wir die Funktion wollen sich anders verhalten. In Java würde das ungefähr so aussehen.
if (arg != null) {
return doSomething(arg);
} else {
return doSomethingElse();
}
In Scala machen wir das auf eine typsichere Weise.
arg match {
case None => doSomethingElse()
case Some(x) => doSomething(x) // Note that x is A, not Option[A]
}
Option 3: None
ist nur ein Standard
Manchmal None
zeigt nur, dass wir einen Standardwert verwenden möchten. Wenn wir eine Reihe von Zahlen addieren, und einige von ihnen könnten None
sein, wollen wir None
mit dem numerischen Wert 0
gleichsetzen, so dass es unsere Ergebnisse nicht ändert.
In Java, könnten wir schreiben,
int x = 0;
if (arg != null)
x = arg;
return doSomething(x);
In Scala, können wir dies prägnanter mit getOrElse
tun.
doSomething(arg.getOrElse(0))
Option 4: Propagieren der Fehler Loudly
Vielleicht ist None
wirklich schlecht in unserem Fall. Vielleicht ist es ein Fehler im aufgerufenen Code, für den wir überhaupt nicht gerüstet sind. Vielleicht ist unsere Funktion nur waaaay zu wichtig, und wenn es fehlschlägt, dann ist alles andere verfallen. Dann können wir eine Ausnahme machen. Beachten Sie, dass dieser Ansatz in Scala nicht sehr idiomatisch ist, also sollte er sehr sparsam verwendet werden, nur wenn es keinen Sinn macht, etwas davon zu tun.
In Java
if (arg == null)
throw new RuntimeException("Oops!");
return doSomething(arg);
In Scala,
arg match {
case None => sys.error("Oops!")
case x => doSomething(x)
}
Das hängt sehr davon ab, was Sie tun möchten, wenn Ihre Option "None" ist. PS: In dem Code, den Sie uns gezeigt haben, gibt es nichts, was den Typ 'Option [Int]' hat. Hast du vielleicht den falschen Code gepostet? Bitte posten Sie auch die genaue Fehlermeldung. – sepp2k
Danke! und wenn es eine Option in der UserEntity gibt, habe ich es schon gesehen ... –
Ich bearbeite die Frage, um die genannten Details zu klären, danke! –